From a0fef3abc46c4817d6eddd5b5a66b71528ec8463 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 6 Dec 2022 17:36:34 -0600 Subject: [PATCH] Refactor Kind out of trait signatures --- Cargo.toml | 2 +- activitystreams-ext/Cargo.toml | 4 +- activitystreams-ext/examples/public_key.rs | 6 +- activitystreams-ext/src/ext1.rs | 151 +- activitystreams-ext/src/ext2.rs | 151 +- activitystreams-ext/src/ext3.rs | 151 +- activitystreams-ext/src/ext4.rs | 151 +- activitystreams-ext/src/lib.rs | 50 +- examples/handle_incoming.rs | 2 +- src/activity.rs | 3153 +++++++++++--------- src/actor.rs | 82 +- src/base.rs | 85 +- src/collection.rs | 154 +- src/lib.rs | 14 +- src/link.rs | 45 +- src/markers.rs | 4 +- src/object.rs | 154 +- src/unparsed.rs | 29 +- 18 files changed, 2454 insertions(+), 1934 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b813b08..7ca7a5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "activitystreams" description = "A set of core types and traits for activitystreams data" -version = "0.7.0-alpha.20" +version = "0.7.0-alpha.21" license = "GPL-3.0" authors = ["asonix "] repository = "https://git.asonix.dog/asonix/activitystreams" diff --git a/activitystreams-ext/Cargo.toml b/activitystreams-ext/Cargo.toml index d1ed49d..f4ef567 100644 --- a/activitystreams-ext/Cargo.toml +++ b/activitystreams-ext/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "activitystreams-ext" description = "Extension types for the ActivityStreams crate" -version = "0.1.0-alpha.2" +version = "0.1.0-alpha.3" license = "GPL-3.0" authors = ["asonix "] repository = "https://git.asonix.dog/Aardwolf/activitystreams" @@ -13,7 +13,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -activitystreams = { version = "0.7.0-alpha.3", path = ".." } +activitystreams = { version = "0.7.0-alpha.21", path = ".." } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/activitystreams-ext/examples/public_key.rs b/activitystreams-ext/examples/public_key.rs index 0478c7a..4724f85 100644 --- a/activitystreams-ext/examples/public_key.rs +++ b/activitystreams-ext/examples/public_key.rs @@ -1,10 +1,10 @@ use activitystreams::{ actor::{ApActor, Person}, context, + iri_string::types::IriString, prelude::*, security, unparsed::UnparsedMutExt, - url::Url, }; use activitystreams_ext::{Ext1, UnparsedExtension}; @@ -17,8 +17,8 @@ pub struct PublicKey { #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "camelCase")] pub struct PublicKeyInner { - id: Url, - owner: Url, + id: IriString, + owner: IriString, public_key_pem: String, } diff --git a/activitystreams-ext/src/ext1.rs b/activitystreams-ext/src/ext1.rs index c0d99df..79ae5ff 100644 --- a/activitystreams-ext/src/ext1.rs +++ b/activitystreams-ext/src/ext1.rs @@ -1,15 +1,15 @@ use crate::Ext1; use activitystreams::{ activity::{ - Activity, ActorAndObjectRef, AsActivity, AsQuestion, OptOriginRef, OptTargetRef, OriginRef, - Question, TargetRef, + Activity, ActivityActor, ActivityObject, AsActivity, AsActivityActor, AsActivityObject, + AsOptOrigin, AsOptTarget, AsOrigin, AsQuestion, AsTarget, OptOrigin, OptTarget, Origin, + Question, Target, }, actor::{ApActor, AsApActor}, - base::{AnyBase, AsBase, Base}, + base::{AsBase, Base}, collection::{AsCollection, AsCollectionPage, Collection, CollectionPage}, markers, object::{ApObject, AsApObject, AsObject, Object}, - primitives::OneOrMany, }; impl markers::Base for Ext1 where Inner: markers::Base {} @@ -23,28 +23,32 @@ impl markers::IntransitiveActivity for Ext1 where { } -impl AsBase for Ext1 +impl AsBase for Ext1 where - Inner: AsBase, + Inner: AsBase, { - fn base_ref(&self) -> &Base { + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Ext1 +impl AsObject for Ext1 where - Inner: AsObject, + Inner: AsObject, { - fn object_ref(&self) -> &Object { + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } @@ -62,28 +66,32 @@ where } } -impl AsCollection for Ext1 +impl AsCollection for Ext1 where - Inner: AsCollection, + Inner: AsCollection, { - fn collection_ref(&self) -> &Collection { + type Kind = Inner::Kind; + + fn collection_ref(&self) -> &Collection { self.inner.collection_ref() } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { self.inner.collection_mut() } } -impl AsCollectionPage for Ext1 +impl AsCollectionPage for Ext1 where - Inner: AsCollectionPage, + Inner: AsCollectionPage, { - fn collection_page_ref(&self) -> &CollectionPage { + type Kind = Inner::Kind; + + fn collection_page_ref(&self) -> &CollectionPage { self.inner.collection_page_ref() } - fn collection_page_mut(&mut self) -> &mut CollectionPage { + fn collection_page_mut(&mut self) -> &mut CollectionPage { self.inner.collection_page_mut() } } @@ -101,89 +109,108 @@ where } } -impl AsActivity for Ext1 +impl AsActivity for Ext1 where - Inner: AsActivity, + Inner: AsActivity, { - fn activity_ref(&self) -> &Activity { + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { self.inner.activity_ref() } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self.inner.activity_mut() } } -impl ActorAndObjectRef for Ext1 +impl AsActivityActor for Ext1 where - Inner: ActorAndObjectRef, + Inner: AsActivityActor, { - fn actor_field_ref(&self) -> &OneOrMany { - self.inner.actor_field_ref() + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() } - fn actor_field_mut(&mut self) -> &mut OneOrMany { - self.inner.actor_field_mut() - } - - fn object_field_ref(&self) -> &OneOrMany { - self.inner.object_field_ref() - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - self.inner.object_field_mut() + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() } } -impl TargetRef for Ext1 +impl AsActivityObject for Ext1 where - Inner: TargetRef, + Inner: AsActivityObject, { - fn target_field_ref(&self) -> &OneOrMany { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() } - fn target_field_mut(&mut self) -> &mut OneOrMany { - self.inner.target_field_mut() + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() } } -impl OriginRef for Ext1 +impl AsTarget for Ext1 where - Inner: OriginRef, + Inner: AsTarget, { - fn origin_field_ref(&self) -> &OneOrMany { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() } - fn origin_field_mut(&mut self) -> &mut OneOrMany { - self.inner.origin_field_mut() + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() } } -impl OptTargetRef for Ext1 +impl AsOrigin for Ext1 where - Inner: OptTargetRef, + Inner: AsOrigin, { - fn target_field_ref(&self) -> &Option> { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() } - fn target_field_mut(&mut self) -> &mut Option> { - self.inner.target_field_mut() + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() } } -impl OptOriginRef for Ext1 +impl AsOptTarget for Ext1 where - Inner: OptOriginRef, + Inner: AsOptTarget, { - fn origin_field_ref(&self) -> &Option> { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() } - fn origin_field_mut(&mut self) -> &mut Option> { - self.inner.origin_field_mut() + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOptOrigin for Ext1 +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() } } diff --git a/activitystreams-ext/src/ext2.rs b/activitystreams-ext/src/ext2.rs index f76646c..16abb2b 100644 --- a/activitystreams-ext/src/ext2.rs +++ b/activitystreams-ext/src/ext2.rs @@ -1,15 +1,15 @@ use crate::Ext2; use activitystreams::{ activity::{ - Activity, ActorAndObjectRef, AsActivity, AsQuestion, OptOriginRef, OptTargetRef, OriginRef, - Question, TargetRef, + Activity, ActivityActor, ActivityObject, AsActivity, AsActivityActor, AsActivityObject, + AsOptOrigin, AsOptTarget, AsOrigin, AsQuestion, AsTarget, OptOrigin, OptTarget, Origin, + Question, Target, }, actor::{ApActor, AsApActor}, - base::{AnyBase, AsBase, Base}, + base::{AsBase, Base}, collection::{AsCollection, AsCollectionPage, Collection, CollectionPage}, markers, object::{ApObject, AsApObject, AsObject, Object}, - primitives::OneOrMany, }; impl markers::Base for Ext2 where Inner: markers::Base {} @@ -23,28 +23,32 @@ impl markers::IntransitiveActivity for Ext2 where { } -impl AsBase for Ext2 +impl AsBase for Ext2 where - Inner: AsBase, + Inner: AsBase, { - fn base_ref(&self) -> &Base { + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Ext2 +impl AsObject for Ext2 where - Inner: AsObject, + Inner: AsObject, { - fn object_ref(&self) -> &Object { + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } @@ -62,28 +66,32 @@ where } } -impl AsCollection for Ext2 +impl AsCollection for Ext2 where - Inner: AsCollection, + Inner: AsCollection, { - fn collection_ref(&self) -> &Collection { + type Kind = Inner::Kind; + + fn collection_ref(&self) -> &Collection { self.inner.collection_ref() } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { self.inner.collection_mut() } } -impl AsCollectionPage for Ext2 +impl AsCollectionPage for Ext2 where - Inner: AsCollectionPage, + Inner: AsCollectionPage, { - fn collection_page_ref(&self) -> &CollectionPage { + type Kind = Inner::Kind; + + fn collection_page_ref(&self) -> &CollectionPage { self.inner.collection_page_ref() } - fn collection_page_mut(&mut self) -> &mut CollectionPage { + fn collection_page_mut(&mut self) -> &mut CollectionPage { self.inner.collection_page_mut() } } @@ -101,89 +109,108 @@ where } } -impl AsActivity for Ext2 +impl AsActivity for Ext2 where - Inner: AsActivity, + Inner: AsActivity, { - fn activity_ref(&self) -> &Activity { + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { self.inner.activity_ref() } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self.inner.activity_mut() } } -impl ActorAndObjectRef for Ext2 +impl AsActivityActor for Ext2 where - Inner: ActorAndObjectRef, + Inner: AsActivityActor, { - fn actor_field_ref(&self) -> &OneOrMany { - self.inner.actor_field_ref() + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() } - fn actor_field_mut(&mut self) -> &mut OneOrMany { - self.inner.actor_field_mut() - } - - fn object_field_ref(&self) -> &OneOrMany { - self.inner.object_field_ref() - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - self.inner.object_field_mut() + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() } } -impl TargetRef for Ext2 +impl AsActivityObject for Ext2 where - Inner: TargetRef, + Inner: AsActivityObject, { - fn target_field_ref(&self) -> &OneOrMany { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() } - fn target_field_mut(&mut self) -> &mut OneOrMany { - self.inner.target_field_mut() + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() } } -impl OriginRef for Ext2 +impl AsTarget for Ext2 where - Inner: OriginRef, + Inner: AsTarget, { - fn origin_field_ref(&self) -> &OneOrMany { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() } - fn origin_field_mut(&mut self) -> &mut OneOrMany { - self.inner.origin_field_mut() + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() } } -impl OptTargetRef for Ext2 +impl AsOrigin for Ext2 where - Inner: OptTargetRef, + Inner: AsOrigin, { - fn target_field_ref(&self) -> &Option> { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() } - fn target_field_mut(&mut self) -> &mut Option> { - self.inner.target_field_mut() + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() } } -impl OptOriginRef for Ext2 +impl AsOptTarget for Ext2 where - Inner: OptOriginRef, + Inner: AsOptTarget, { - fn origin_field_ref(&self) -> &Option> { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() } - fn origin_field_mut(&mut self) -> &mut Option> { - self.inner.origin_field_mut() + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOptOrigin for Ext2 +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() } } diff --git a/activitystreams-ext/src/ext3.rs b/activitystreams-ext/src/ext3.rs index bad78eb..dbcfd47 100644 --- a/activitystreams-ext/src/ext3.rs +++ b/activitystreams-ext/src/ext3.rs @@ -1,15 +1,15 @@ use crate::Ext3; use activitystreams::{ activity::{ - Activity, ActorAndObjectRef, AsActivity, AsQuestion, OptOriginRef, OptTargetRef, OriginRef, - Question, TargetRef, + Activity, ActivityActor, ActivityObject, AsActivity, AsActivityActor, AsActivityObject, + AsOptOrigin, AsOptTarget, AsOrigin, AsQuestion, AsTarget, OptOrigin, OptTarget, Origin, + Question, Target, }, actor::{ApActor, AsApActor}, - base::{AnyBase, AsBase, Base}, + base::{AsBase, Base}, collection::{AsCollection, AsCollectionPage, Collection, CollectionPage}, markers, object::{ApObject, AsApObject, AsObject, Object}, - primitives::OneOrMany, }; impl markers::Base for Ext3 where Inner: markers::Base {} @@ -26,28 +26,32 @@ impl markers::IntransitiveActivity for Ext3 wher { } -impl AsBase for Ext3 +impl AsBase for Ext3 where - Inner: AsBase, + Inner: AsBase, { - fn base_ref(&self) -> &Base { + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Ext3 +impl AsObject for Ext3 where - Inner: AsObject, + Inner: AsObject, { - fn object_ref(&self) -> &Object { + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } @@ -65,28 +69,32 @@ where } } -impl AsCollection for Ext3 +impl AsCollection for Ext3 where - Inner: AsCollection, + Inner: AsCollection, { - fn collection_ref(&self) -> &Collection { + type Kind = Inner::Kind; + + fn collection_ref(&self) -> &Collection { self.inner.collection_ref() } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { self.inner.collection_mut() } } -impl AsCollectionPage for Ext3 +impl AsCollectionPage for Ext3 where - Inner: AsCollectionPage, + Inner: AsCollectionPage, { - fn collection_page_ref(&self) -> &CollectionPage { + type Kind = Inner::Kind; + + fn collection_page_ref(&self) -> &CollectionPage { self.inner.collection_page_ref() } - fn collection_page_mut(&mut self) -> &mut CollectionPage { + fn collection_page_mut(&mut self) -> &mut CollectionPage { self.inner.collection_page_mut() } } @@ -104,89 +112,108 @@ where } } -impl AsActivity for Ext3 +impl AsActivity for Ext3 where - Inner: AsActivity, + Inner: AsActivity, { - fn activity_ref(&self) -> &Activity { + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { self.inner.activity_ref() } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self.inner.activity_mut() } } -impl ActorAndObjectRef for Ext3 +impl AsActivityActor for Ext3 where - Inner: ActorAndObjectRef, + Inner: AsActivityActor, { - fn actor_field_ref(&self) -> &OneOrMany { - self.inner.actor_field_ref() + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() } - fn actor_field_mut(&mut self) -> &mut OneOrMany { - self.inner.actor_field_mut() - } - - fn object_field_ref(&self) -> &OneOrMany { - self.inner.object_field_ref() - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - self.inner.object_field_mut() + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() } } -impl TargetRef for Ext3 +impl AsActivityObject for Ext3 where - Inner: TargetRef, + Inner: AsActivityObject, { - fn target_field_ref(&self) -> &OneOrMany { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() } - fn target_field_mut(&mut self) -> &mut OneOrMany { - self.inner.target_field_mut() + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() } } -impl OriginRef for Ext3 +impl AsTarget for Ext3 where - Inner: OriginRef, + Inner: AsTarget, { - fn origin_field_ref(&self) -> &OneOrMany { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() } - fn origin_field_mut(&mut self) -> &mut OneOrMany { - self.inner.origin_field_mut() + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() } } -impl OptTargetRef for Ext3 +impl AsOrigin for Ext3 where - Inner: OptTargetRef, + Inner: AsOrigin, { - fn target_field_ref(&self) -> &Option> { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() } - fn target_field_mut(&mut self) -> &mut Option> { - self.inner.target_field_mut() + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() } } -impl OptOriginRef for Ext3 +impl AsOptTarget for Ext3 where - Inner: OptOriginRef, + Inner: AsOptTarget, { - fn origin_field_ref(&self) -> &Option> { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() } - fn origin_field_mut(&mut self) -> &mut Option> { - self.inner.origin_field_mut() + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOptOrigin for Ext3 +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() } } diff --git a/activitystreams-ext/src/ext4.rs b/activitystreams-ext/src/ext4.rs index a734471..62fdb36 100644 --- a/activitystreams-ext/src/ext4.rs +++ b/activitystreams-ext/src/ext4.rs @@ -1,15 +1,15 @@ use crate::Ext4; use activitystreams::{ activity::{ - Activity, ActorAndObjectRef, AsActivity, AsQuestion, OptOriginRef, OptTargetRef, OriginRef, - Question, TargetRef, + Activity, ActivityActor, ActivityObject, AsActivity, AsActivityActor, AsActivityObject, + AsOptOrigin, AsOptTarget, AsOrigin, AsQuestion, AsTarget, OptOrigin, OptTarget, Origin, + Question, Target, }, actor::{ApActor, AsApActor}, - base::{AnyBase, AsBase, Base}, + base::{AsBase, Base}, collection::{AsCollection, AsCollectionPage, Collection, CollectionPage}, markers, object::{ApObject, AsApObject, AsObject, Object}, - primitives::OneOrMany, }; impl markers::Base for Ext4 where Inner: markers::Base {} @@ -29,28 +29,32 @@ impl markers::IntransitiveActivity for Ext4 AsBase for Ext4 +impl AsBase for Ext4 where - Inner: AsBase, + Inner: AsBase, { - fn base_ref(&self) -> &Base { + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Ext4 +impl AsObject for Ext4 where - Inner: AsObject, + Inner: AsObject, { - fn object_ref(&self) -> &Object { + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } @@ -68,28 +72,32 @@ where } } -impl AsCollection for Ext4 +impl AsCollection for Ext4 where - Inner: AsCollection, + Inner: AsCollection, { - fn collection_ref(&self) -> &Collection { + type Kind = Inner::Kind; + + fn collection_ref(&self) -> &Collection { self.inner.collection_ref() } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { self.inner.collection_mut() } } -impl AsCollectionPage for Ext4 +impl AsCollectionPage for Ext4 where - Inner: AsCollectionPage, + Inner: AsCollectionPage, { - fn collection_page_ref(&self) -> &CollectionPage { + type Kind = Inner::Kind; + + fn collection_page_ref(&self) -> &CollectionPage { self.inner.collection_page_ref() } - fn collection_page_mut(&mut self) -> &mut CollectionPage { + fn collection_page_mut(&mut self) -> &mut CollectionPage { self.inner.collection_page_mut() } } @@ -107,89 +115,108 @@ where } } -impl AsActivity for Ext4 +impl AsActivity for Ext4 where - Inner: AsActivity, + Inner: AsActivity, { - fn activity_ref(&self) -> &Activity { + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { self.inner.activity_ref() } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self.inner.activity_mut() } } -impl ActorAndObjectRef for Ext4 +impl AsActivityActor for Ext4 where - Inner: ActorAndObjectRef, + Inner: AsActivityActor, { - fn actor_field_ref(&self) -> &OneOrMany { - self.inner.actor_field_ref() + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() } - fn actor_field_mut(&mut self) -> &mut OneOrMany { - self.inner.actor_field_mut() - } - - fn object_field_ref(&self) -> &OneOrMany { - self.inner.object_field_ref() - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - self.inner.object_field_mut() + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() } } -impl TargetRef for Ext4 +impl AsActivityObject for Ext4 where - Inner: TargetRef, + Inner: AsActivityObject, { - fn target_field_ref(&self) -> &OneOrMany { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() } - fn target_field_mut(&mut self) -> &mut OneOrMany { - self.inner.target_field_mut() + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() } } -impl OriginRef for Ext4 +impl AsTarget for Ext4 where - Inner: OriginRef, + Inner: AsTarget, { - fn origin_field_ref(&self) -> &OneOrMany { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() } - fn origin_field_mut(&mut self) -> &mut OneOrMany { - self.inner.origin_field_mut() + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() } } -impl OptTargetRef for Ext4 +impl AsOrigin for Ext4 where - Inner: OptTargetRef, + Inner: AsOrigin, { - fn target_field_ref(&self) -> &Option> { - self.inner.target_field_ref() + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() } - fn target_field_mut(&mut self) -> &mut Option> { - self.inner.target_field_mut() + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() } } -impl OptOriginRef for Ext4 +impl AsOptTarget for Ext4 where - Inner: OptOriginRef, + Inner: AsOptTarget, { - fn origin_field_ref(&self) -> &Option> { - self.inner.origin_field_ref() + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() } - fn origin_field_mut(&mut self) -> &mut Option> { - self.inner.origin_field_mut() + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOptOrigin for Ext4 +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() } } diff --git a/activitystreams-ext/src/lib.rs b/activitystreams-ext/src/lib.rs index 24bd6c7..d226621 100644 --- a/activitystreams-ext/src/lib.rs +++ b/activitystreams-ext/src/lib.rs @@ -1,10 +1,10 @@ //! # An extension API for activitystreams //! _This crate provides Ext1, Ext2, Ext3, and Ext4 for adding extensions to ActivityStreams types_ //! -//! - Find the code on [git.asonix.dog](https://git.asonix.dog/Aardwolf/activitystreams) +//! - Find the code on [git.asonix.dog](https://git.asonix.dog/asonix/activitystreams) //! - Read the docs on [docs.rs](https://docs.rs/activitystreams-ext) //! - Join the matrix channel at [#activitypub:asonix.dog](https://matrix.to/#/!fAEcHyTUdAaKCzIKCt:asonix.dog?via=asonix.dog&via=matrix.org&via=t2bot.io) -//! - Hit me up on [mastodon](https://asonix.dog/@asonix) +//! - Hit me up on [mastodon](https://masto.asonix.dog/@asonix) //! //! ## Usage //! @@ -23,7 +23,7 @@ //! prelude::*, //! security, //! unparsed::UnparsedMutExt, -//! url::Url, +//! iri_string::types::IriString, //! }; //! use activitystreams_ext::{Ext1, UnparsedExtension}; //! @@ -36,8 +36,8 @@ //! #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] //! #[serde(rename_all = "camelCase")] //! pub struct PublicKeyInner { -//! id: Url, -//! owner: Url, +//! id: IriString, +//! owner: IriString, //! public_key_pem: String, //! } //! @@ -264,22 +264,24 @@ impl Ext4 { } } -impl Extends for Ext1 +impl Extends for Ext1 where - Inner: Extends + UnparsedMut, + Inner: Extends + UnparsedMut, A: UnparsedExtension, Error: From + std::error::Error, { + type Kind = Inner::Kind; + type Error = Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let mut inner = Inner::extends(base)?; let ext_one = A::try_from_unparsed(&mut inner)?; Ok(Ext1 { inner, ext_one }) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let Ext1 { mut inner, ext_one } = self; ext_one.try_into_unparsed(&mut inner)?; @@ -287,16 +289,18 @@ where } } -impl Extends for Ext2 +impl Extends for Ext2 where - Inner: Extends + UnparsedMut, + Inner: Extends + UnparsedMut, A: UnparsedExtension, B: UnparsedExtension, Error: From + std::error::Error, { + type Kind = Inner::Kind; + type Error = Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let mut inner = Inner::extends(base)?; let ext_one = A::try_from_unparsed(&mut inner)?; let ext_two = B::try_from_unparsed(&mut inner)?; @@ -308,7 +312,7 @@ where }) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let Ext2 { mut inner, ext_one, @@ -321,17 +325,19 @@ where } } -impl Extends for Ext3 +impl Extends for Ext3 where - Inner: Extends + UnparsedMut, + Inner: Extends + UnparsedMut, A: UnparsedExtension, B: UnparsedExtension, C: UnparsedExtension, Error: From + std::error::Error, { + type Kind = Inner::Kind; + type Error = Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let mut inner = Inner::extends(base)?; let ext_one = A::try_from_unparsed(&mut inner)?; let ext_two = B::try_from_unparsed(&mut inner)?; @@ -345,7 +351,7 @@ where }) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let Ext3 { mut inner, ext_one, @@ -360,18 +366,20 @@ where } } -impl Extends for Ext4 +impl Extends for Ext4 where - Inner: Extends + UnparsedMut, + Inner: Extends + UnparsedMut, A: UnparsedExtension, B: UnparsedExtension, C: UnparsedExtension, D: UnparsedExtension, Error: From + std::error::Error, { + type Kind = Inner::Kind; + type Error = Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let mut inner = Inner::extends(base)?; let ext_one = A::try_from_unparsed(&mut inner)?; let ext_two = B::try_from_unparsed(&mut inner)?; @@ -387,7 +395,7 @@ where }) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let Ext4 { mut inner, ext_one, diff --git a/examples/handle_incoming.rs b/examples/handle_incoming.rs index 0ca2f2a..b5bc72d 100644 --- a/examples/handle_incoming.rs +++ b/examples/handle_incoming.rs @@ -33,7 +33,7 @@ pub fn handle_activity(activity: AcceptedActivity) -> Result<(), anyhow::Error> Ok(()) } -static EXAMPLE_JSON: &str = r#"{"actor":"https://asonix.dog/users/asonix","object":"https://asonix.dog/users/asonix/posts/1","type":"Announce"}"#; +static EXAMPLE_JSON: &str = r#"{"id":"https://asonix.dog/activities/1","actor":"https://asonix.dog/users/asonix","object":"https://asonix.dog/users/asonix/posts/1","type":"Announce"}"#; fn main() -> Result<(), anyhow::Error> { handle_activity(serde_json::from_str(EXAMPLE_JSON)?) diff --git a/src/activity.rs b/src/activity.rs index f757079..fc2c498 100644 --- a/src/activity.rs +++ b/src/activity.rs @@ -42,77 +42,85 @@ use self::kind::*; /// Implementation trait for deriving Activity methods for a type /// /// Any type implementing AsObject will automatically gain methods provided by ActivityExt -pub trait AsActivity: markers::Activity { +pub trait AsActivity: markers::Activity { + type Kind; + /// Immutable borrow of `Activity` - fn activity_ref(&self) -> &Activity; + fn activity_ref(&self) -> &Activity; /// Mutable borrow of `Activity` - fn activity_mut(&mut self) -> &mut Activity; + fn activity_mut(&mut self) -> &mut Activity; } /// Implementation trait for deriving Actor and Object methods for a type /// -/// Any type implementing ActorAndObjectRef will automatically gain methods provided by -/// `ActorAndObjectRefExt` -pub trait ActorAndObjectRef: markers::Activity { - /// Immutable borrow of actor field - fn actor_field_ref(&self) -> &OneOrMany; +/// Any type implementing AsActivityActor will automatically gain methods provided by +/// `AsActivityActorExt` +pub trait AsActivityActor: markers::Activity { + type Inner; - /// Immutable borrow of object field - fn object_field_ref(&self) -> &OneOrMany; + fn activity_actor_ref(&self) -> &ActivityActor; - /// Mutable borrow of actor field - fn actor_field_mut(&mut self) -> &mut OneOrMany; + fn activity_actor_mut(&mut self) -> &mut ActivityActor; +} - /// Mutable borrow of object field - fn object_field_mut(&mut self) -> &mut OneOrMany; +/// Implementation trait for deriving Actor and Object methods for a type +/// +/// Any type implementing AsActivityObject will automatically gain methods provided by +/// `AsActivityObjectExt` +pub trait AsActivityObject: markers::Activity { + type Inner; + + fn activity_object_ref(&self) -> &ActivityObject; + + fn activity_object_mut(&mut self) -> &mut ActivityObject; } /// Implementation trait for deriving Target methods for a type /// -/// Any type implementing TargetRef will automatically gain methods provided by `TargetRefExt` -pub trait TargetRef: markers::Activity { - /// Immutable borrow of target field - fn target_field_ref(&self) -> &OneOrMany; +/// Any type implementing AsTarget will automatically gain methods provided by `AsTargetExt` +pub trait AsTarget: markers::Activity { + type Inner; - /// Mutable borrow of target field - fn target_field_mut(&mut self) -> &mut OneOrMany; + fn target_ref(&self) -> &Target; + + fn target_mut(&mut self) -> &mut Target; } /// Implementation trait for deriving Origin methods for a type /// -/// Any type implementing OriginRef will automatically gain methods provided by -/// `OriginRefExt` -pub trait OriginRef: markers::Activity { - /// Immutable borrow of origin field - fn origin_field_ref(&self) -> &OneOrMany; +/// Any type implementing AsOrigin will automatically gain methods provided by +/// `AsOriginExt` +pub trait AsOrigin: markers::Activity { + type Inner; - /// Mutable borrow of origin field - fn origin_field_mut(&mut self) -> &mut OneOrMany; + fn origin_ref(&self) -> &Origin; + + fn origin_mut(&mut self) -> &mut Origin; } /// Implementation trait for deriving Target methods for a type /// -/// Any type implementing OptTargetRef will automatically gain methods provided by -/// `OptTargetRefExt` -pub trait OptTargetRef: markers::Activity { - /// Immutable borrow of target field - fn target_field_ref(&self) -> &Option>; +/// Any type implementing AsOptTarget will automatically gain methods provided by +/// `AsOptTargetExt` +pub trait AsOptTarget: markers::Activity { + type Inner; - /// Mutable borrow of target field - fn target_field_mut(&mut self) -> &mut Option>; + fn opt_target_ref(&self) -> &OptTarget; + + fn opt_target_mut(&mut self) -> &mut OptTarget; } /// Implementation trait for deriving Origin methods for a type /// -/// Any type implementing OptOriginRef will automatically gain methods provided by -/// `OptOriginRefExt` -pub trait OptOriginRef: markers::Activity { - /// Immutable borrow of origin field - fn origin_field_ref(&self) -> &Option>; +/// Any type implementing AsOptOrigin will automatically gain methods provided by +/// `AsOptOriginExt` +pub trait AsOptOrigin: markers::Activity { + type Inner; - /// Mutable borrow of origin field - fn origin_field_mut(&mut self) -> &mut Option>; + fn opt_origin_ref(&self) -> &OptOrigin; + + fn opt_origin_mut(&mut self) -> &mut OptOrigin; } /// Implementation trait for deriving Question methods for a type @@ -133,7 +141,7 @@ pub trait AsQuestion: markers::Activity { /// /// Documentation for the fields related to these methods can be found on the `Activity` /// struct -pub trait ActivityExt: AsActivity { +pub trait ActivityExt: AsActivity { /// Fetch the result for the current activity /// /// ```rust @@ -148,7 +156,7 @@ pub trait ActivityExt: AsActivity { /// ``` fn result<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.activity_ref().result.as_ref() } @@ -284,7 +292,7 @@ pub trait ActivityExt: AsActivity { /// ``` fn instrument<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.activity_ref().instrument.as_ref() } @@ -411,7 +419,7 @@ pub trait ActivityExt: AsActivity { /// /// Documentation for the fields related to these methods can be found on the /// `ActorAndObject` struct -pub trait ActorAndObjectRefExt: ActorAndObjectRef { +pub trait AsActivityActorExt: AsActivityActor { /// Fetch the actor for the current activity /// /// ```rust @@ -423,9 +431,9 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { /// let actor_ref = create.actor(); /// println!("{:?}", actor_ref); /// ``` - fn actor(&self) -> Result<&OneOrMany, CheckError> + fn actor(&self) -> Result<&OneOrMany, CheckError> where - Self: BaseExt, + Self: BaseExt, { let actor = self.actor_unchecked(); @@ -449,7 +457,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { /// println!("{:?}", actor_ref); /// ``` fn actor_unchecked(&self) -> &OneOrMany { - self.actor_field_ref() + &self.activity_actor_ref().actor } /// Check if the actor's ID is `id` @@ -488,7 +496,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { where T: Into, { - *self.actor_field_mut() = actor.into().into(); + self.activity_actor_mut().actor = actor.into().into(); self } @@ -515,7 +523,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); - *self.actor_field_mut() = v.into(); + self.activity_actor_mut().actor = v.into(); self } @@ -539,10 +547,12 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { where T: Into, { - self.actor_field_mut().add(actor.into()); + self.activity_actor_mut().actor.add(actor.into()); self } +} +pub trait AsActivityObjectExt: AsActivityObject { /// Fetch the object for the current activity /// /// ```rust @@ -554,9 +564,9 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { /// let object_ref = create.object(); /// println!("{:?}", object_ref); /// ``` - fn object(&self) -> Result<&OneOrMany, CheckError> + fn object(&self) -> Result<&OneOrMany, CheckError> where - Self: BaseExt, + Self: BaseExt, { let object = self.object_unchecked(); @@ -580,7 +590,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { /// println!("{:?}", object_ref); /// ``` fn object_unchecked(&self) -> &OneOrMany { - self.object_field_ref() + &self.activity_object_ref().object } /// Check if the object's ID is `id` @@ -619,7 +629,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { where T: Into, { - *self.object_field_mut() = object.into().into(); + self.activity_object_mut().object = object.into().into(); self } @@ -646,7 +656,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); - *self.object_field_mut() = v.into(); + self.activity_object_mut().object = v.into(); self } @@ -670,7 +680,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { where T: Into, { - self.object_field_mut().add(object.into()); + self.activity_object_mut().object.add(object.into()); self } } @@ -678,7 +688,7 @@ pub trait ActorAndObjectRefExt: ActorAndObjectRef { /// Helper methods for interacting with Activity types with a target field /// /// Documentation for the target field can be found on the `Invite` struct -pub trait TargetRefExt: TargetRef { +pub trait AsTargetExt: AsTarget { /// Fetch the target for the current activity /// /// ```rust @@ -691,7 +701,7 @@ pub trait TargetRefExt: TargetRef { /// println!("{:?}", target_ref); /// ``` fn target(&self) -> &OneOrMany { - self.target_field_ref() + &self.target_ref().target } /// Set the target for the current activity @@ -712,7 +722,7 @@ pub trait TargetRefExt: TargetRef { where T: Into, { - *self.target_field_mut() = target.into().into(); + self.target_mut().target = target.into().into(); self } @@ -739,7 +749,7 @@ pub trait TargetRefExt: TargetRef { T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); - *self.target_field_mut() = v.into(); + self.target_mut().target = v.into(); self } @@ -763,7 +773,7 @@ pub trait TargetRefExt: TargetRef { where T: Into, { - self.target_field_mut().add(target.into()); + self.target_mut().target.add(target.into()); self } } @@ -771,7 +781,7 @@ pub trait TargetRefExt: TargetRef { /// Helper methods for interacting with Activity types with an origin /// /// Documentation for the origin field can be found on the `Arrive` struct -pub trait OriginRefExt: OriginRef { +pub trait AsOriginExt: AsOrigin { /// Fetch the origin for the current activity /// /// ```rust @@ -784,7 +794,7 @@ pub trait OriginRefExt: OriginRef { /// println!("{:?}", origin_ref); /// ``` fn origin(&self) -> &OneOrMany { - self.origin_field_ref() + &self.origin_ref().origin } /// Set the origin for the current activity @@ -805,7 +815,7 @@ pub trait OriginRefExt: OriginRef { where T: Into, { - *self.origin_field_mut() = origin.into().into(); + self.origin_mut().origin = origin.into().into(); self } @@ -832,7 +842,7 @@ pub trait OriginRefExt: OriginRef { T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); - *self.origin_field_mut() = v.into(); + self.origin_mut().origin = v.into(); self } @@ -856,7 +866,7 @@ pub trait OriginRefExt: OriginRef { where T: Into, { - self.origin_field_mut().add(origin.into()); + self.origin_mut().origin.add(origin.into()); self } } @@ -864,8 +874,8 @@ pub trait OriginRefExt: OriginRef { /// Helper methods for interacting with Activity types with an optional target field /// /// Documentation for the target field can be found on the -/// `ActorAndObjectOptTarget` struct -pub trait OptTargetRefExt: OptTargetRef { +/// `OptTarget` struct +pub trait AsOptTargetExt: AsOptTarget { /// Fetch the target for the current activity /// /// ```rust @@ -879,7 +889,7 @@ pub trait OptTargetRefExt: OptTargetRef { /// } /// ``` fn target(&self) -> Option<&OneOrMany> { - self.target_field_ref().as_ref() + self.opt_target_ref().target.as_ref() } /// Set the target for the current activity @@ -900,7 +910,7 @@ pub trait OptTargetRefExt: OptTargetRef { where T: Into, { - *self.target_field_mut() = Some(target.into().into()); + self.opt_target_mut().target = Some(target.into().into()); self } @@ -927,7 +937,7 @@ pub trait OptTargetRefExt: OptTargetRef { T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); - *self.target_field_mut() = Some(v.into()); + self.opt_target_mut().target = Some(v.into()); self } @@ -951,14 +961,14 @@ pub trait OptTargetRefExt: OptTargetRef { where T: Into, { - let c = match self.target_field_mut().take() { + let c = match self.opt_target_mut().target.take() { Some(mut c) => { c.add(target.into()); c } None => vec![target.into()].into(), }; - *self.target_field_mut() = Some(c); + self.opt_target_mut().target = Some(c); self } @@ -980,7 +990,7 @@ pub trait OptTargetRefExt: OptTargetRef { /// # } /// ``` fn take_target(&mut self) -> Option> { - self.target_field_mut().take() + self.opt_target_mut().target.take() } /// Delete a target from the current activity @@ -1002,7 +1012,7 @@ pub trait OptTargetRefExt: OptTargetRef { /// # } /// ``` fn delete_target(&mut self) -> &mut Self { - *self.target_field_mut() = None; + self.opt_target_mut().target = None; self } } @@ -1011,7 +1021,7 @@ pub trait OptTargetRefExt: OptTargetRef { /// /// Documentation for the origin field can be found on the /// `Delete` struct -pub trait OptOriginRefExt: OptOriginRef { +pub trait AsOptOriginExt: AsOptOrigin { /// Fetch the origin for the current activity /// /// ```rust @@ -1025,7 +1035,7 @@ pub trait OptOriginRefExt: OptOriginRef { /// } /// ``` fn origin(&self) -> Option<&OneOrMany> { - self.origin_field_ref().as_ref() + self.opt_origin_ref().origin.as_ref() } /// Set the origin for the current activity @@ -1046,7 +1056,7 @@ pub trait OptOriginRefExt: OptOriginRef { where T: Into, { - *self.origin_field_mut() = Some(origin.into().into()); + self.opt_origin_mut().origin = Some(origin.into().into()); self } @@ -1073,7 +1083,7 @@ pub trait OptOriginRefExt: OptOriginRef { T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); - *self.origin_field_mut() = Some(v.into()); + self.opt_origin_mut().origin = Some(v.into()); self } @@ -1097,14 +1107,14 @@ pub trait OptOriginRefExt: OptOriginRef { where T: Into, { - let c = match self.origin_field_mut().take() { + let c = match self.opt_origin_mut().origin.take() { Some(mut c) => { c.add(origin.into()); c } None => vec![origin.into()].into(), }; - *self.origin_field_mut() = Some(c); + self.opt_origin_mut().origin = Some(c); self } @@ -1123,7 +1133,7 @@ pub trait OptOriginRefExt: OptOriginRef { /// # } /// ``` fn take_origin(&mut self) -> Option> { - self.origin_field_mut().take() + self.opt_origin_mut().origin.take() } /// Delete a origin from the current activity @@ -1142,7 +1152,7 @@ pub trait OptOriginRefExt: OptOriginRef { /// # } /// ``` fn delete_origin(&mut self) -> &mut Self { - *self.origin_field_mut() = None; + self.opt_origin_mut().origin = None; self } } @@ -1605,7 +1615,7 @@ pub trait QuestionExt: AsQuestion { /// The target property can be used in certain circumstances to indicate the context into which the /// object has been accepted. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Accept that aren't already present on an ActorAndObject. pub type Accept = ActorAndObject; @@ -1614,8 +1624,8 @@ pub type Accept = ActorAndObject; /// If the target property is not explicitly specified, the target would need to be determined /// implicitly by context. The origin can be used to identify the context from which the object originated. /// -/// This is just an alias for `Object` because there's no fields inherent to -/// Add that aren't already present on an ActorAndObjectOptOriginAndTarget. +/// This is just an alias for `ActorAndObjectOptOriginAndTarget` because there's no fields inherent to +/// Add that aren't already present on an OptOrigin. pub type Add = ActorAndObjectOptOriginAndTarget; /// Indicates that the actor is blocking the object. @@ -1624,19 +1634,19 @@ pub type Add = ActorAndObjectOptOriginAndTarget; /// one user to block activities or content of other users. The target and origin typically have no /// defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Block that aren't already present on an ActorAndObject. pub type Block = ActorAndObject; /// Indicates that the actor has created the object. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Create that aren't already present on an ActorAndObject. pub type Create = ActorAndObject; /// Indicates that the actor dislikes the object. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Dislike that aren't already present on an ActorAndObject. pub type Dislike = ActorAndObject; @@ -1645,7 +1655,7 @@ pub type Dislike = ActorAndObject; /// Flagging is defined in the sense common to many social platforms as reporting content as being /// inappropriate for any number of reasons. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Flag that aren't already present on an ActorAndObject. pub type Flag = ActorAndObject; @@ -1655,7 +1665,7 @@ pub type Flag = ActorAndObject; /// interested in any activity performed by or on the object. The target and origin typically have /// no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to Follow +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Follow /// that aren't already present on an ActorAndObject. pub type Follow = ActorAndObject; @@ -1663,7 +1673,7 @@ pub type Follow = ActorAndObject; /// /// The target and origin typically have no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to Ignore +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Ignore /// that aren't already present on an ActorAndObject. pub type Ignore = ActorAndObject; @@ -1671,7 +1681,7 @@ pub type Ignore = ActorAndObject; /// /// The target and origin typically have no defined meaning /// -/// This is just an alias for `Object` because there's no fields inherent to Join that +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Join that /// aren't already present on an ActorAndObject. pub type Join = ActorAndObject; @@ -1679,7 +1689,7 @@ pub type Join = ActorAndObject; /// /// The target and origin typically have no meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to Leave that +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Leave that /// aren't already present on an ActorAndObject. pub type Leave = ActorAndObject; @@ -1687,19 +1697,19 @@ pub type Leave = ActorAndObject; /// /// The target and origin typically have no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to Like that +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Like that /// aren't already present on an ActorAndObject. pub type Like = ActorAndObject; /// Indicates that the actor has listened to the object. /// -/// This is just an alias for `Object` because there's no fields inherent to Listen +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Listen /// that aren't already present on an ActorAndObject. pub type Listen = ActorAndObject; /// Indicates that the actor has read the object. /// -/// This is just an alias for `Object` because there's no fields inherent to Read that +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Read that /// aren't already present on an ActorAndObject. pub type Read = ActorAndObject; @@ -1707,19 +1717,19 @@ pub type Read = ActorAndObject; /// /// The target and origin typically have no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to Reject +/// This is just an alias for `ActorAndObject` because there's no fields inherent to Reject /// that aren't already present on an ActorAndObject. pub type Reject = ActorAndObject; /// A specialization of Accept indicating that the acceptance is tentative. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// TentativeAccept that aren't already present on an ActorAndObject. pub type TentativeAccept = ActorAndObject; /// A specialization of Reject in which the rejection is considered tentative. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// TentativeReject that aren't already present on an ActorAndObject. pub type TentativeReject = ActorAndObject; @@ -1731,7 +1741,7 @@ pub type TentativeReject = ActorAndObject; /// /// The target and origin typically have no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Undo that aren't already present on an ActorAndObject. pub type Undo = ActorAndObject; @@ -1742,13 +1752,13 @@ pub type Undo = ActorAndObject; /// /// The target and origin typically have no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// Update that aren't already present on an ActorAndObject. pub type Update = ActorAndObject; /// Indicates that the actor has viewed the object. /// -/// This is just an alias for `Object` because there's no fields inherent to +/// This is just an alias for `ActorAndObject` because there's no fields inherent to /// View that aren't already present on an ActorAndObject. pub type View = ActorAndObject; @@ -1756,338 +1766,54 @@ pub type View = ActorAndObject; /// /// The origin typically has no defined meaning. /// -/// This is just an alias for `Object` because there's no fields inherent to -/// Announce that aren't already present on an ActorAndObjectOptTarget. +/// This is just an alias for `ActorAndObjectOptTarget` because there's no fields inherent to +/// Announce that aren't already present on an OptTarget. pub type Announce = ActorAndObjectOptTarget; /// Indicates that the actor is offering the object. /// /// If specified, the target indicates the entity to which the object is being offered. /// -/// This is just an alias for `Object` because there's no fields inherent to -/// Offer that aren't already present on an ActorAndObjectOptTarget. +/// This is just an alias for `ActorAndObjectOptTarget` because there's no fields inherent to +/// Offer that aren't already present on an OptTarget. pub type Offer = ActorAndObjectOptTarget; /// Indicates that the actor has moved object from origin to target. /// /// If the origin or target are not specified, either can be determined by context. /// -/// This is just an alias for `Object` because there's no fields inherent to -/// Move that aren't already present on an ActorAndObjectOptOriginAndTarget. -pub type Move = ActorAndObjectOptOriginAndTarget; +/// This is just an alias for `ActorAndObject` because there's no fields inherent to +/// Move that aren't already present on an OptOrigin. +pub type Move = ActorAndObjectOptOrigin; /// Indicates that the actor is removing the object. /// /// If specified, the origin indicates the context from which the object is being removed. /// -/// This is just an alias for `Object` because there's no fields inherent to -/// Remove that aren't already present on an ActorAndObjectOptOriginAndTarget. -pub type Remove = ActorAndObjectOptOriginAndTarget; - -/// Activity objects are specializations of the base Object type that provide information about -/// actions that have either already occurred, are in the process of occurring, or may occur in the -/// future. -#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Activity { - /// Describes the result of the activity. - /// - /// For instance, if a particular action results in the creation of a new resource, the result - /// property can be used to describe that new resource. - /// - /// - Range: Object | Link - /// - Funcitonal: false - #[serde(skip_serializing_if = "Option::is_none")] - result: Option>, - - /// Identifies one or more objects used (or to be used) in the completion of an Activity. - /// - /// - Range: Object | Link - /// - Funcitonal: false - #[serde(skip_serializing_if = "Option::is_none")] - instrument: Option>, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Object, -} - -/// Activity with actor and object properties -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ActorAndObject { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// When used within an Activity, describes the direct object of the activity. - /// - /// For instance, in the activity "John added a movie to his wishlist", the object of the - /// activity is the movie added. - /// - /// - Range: Object | Link - /// - Functional: false - object: OneOrMany, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} +/// This is just an alias for `ActorAndObject` because there's no fields inherent to +/// Remove that aren't already present on an OptOrigin. +pub type Remove = ActorAndObjectOptOrigin; /// An IntransitiveActivity that indicates that the actor has arrived at the location. /// /// The origin can be used to identify the context from which the actor originated. The target /// typically has no defined meaning. -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Arrive { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// Describes an indirect object of the activity from which the activity is directed. - /// - /// The precise meaning of the origin is the object of the English preposition "from". For - /// instance, in the activity "John moved an item to List B from List A", the origin of the - /// activity is "List A". - /// - /// - Range: Object | Link - /// - Functional: false - origin: OneOrMany, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} +pub type Arrive = ActorAndOrigin; /// A specialization of Offer in which the actor is extending an invitation for the object to the /// target. -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Invite { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// When used within an Activity, describes the direct object of the activity. - /// - /// For instance, in the activity "John added a movie to his wishlist", the object of the - /// activity is the movie added. - /// - /// - Range: Object | Link - /// - Functional: false - object: OneOrMany, - - /// Describes the indirect object, or target, of the activity. - /// - /// The precise meaning of the target is largely dependent on the type of action being - /// described but will often be the object of the English preposition "to". For instance, in - /// the activity "John added a movie to his wishlist", the target of the activity is John's - /// wishlist. An activity can have more than one target - /// - /// - Range: Object | Link - /// - Functional: false - target: OneOrMany, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} +pub type Invite = Target>; /// Indicates that the actor has deleted the object. /// /// If specified, the origin indicates the context from which the object was deleted. -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Delete { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// When used within an Activity, describes the direct object of the activity. - /// - /// For instance, in the activity "John added a movie to his wishlist", the object of the - /// activity is the movie added. - /// - /// - Range: Object | Link - /// - Functional: false - object: OneOrMany, - - /// Describes an indirect object of the activity from which the activity is directed. - /// - /// The precise meaning of the origin is the object of the English preposition "from". For - /// instance, in the activity "John moved an item to List B from List A", the origin of the - /// activity is "List A". - /// - /// - Range: Object | Link - /// - Functional: false - #[serde(skip_serializing_if = "Option::is_none")] - origin: Option>, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} - -/// Activity with actor, object, and optional origin and target properties -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ActorAndObjectOptOriginAndTarget { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// When used within an Activity, describes the direct object of the activity. - /// - /// For instance, in the activity "John added a movie to his wishlist", the object of the - /// activity is the movie added. - /// - /// - Range: Object | Link - /// - Functional: false - object: OneOrMany, - - /// Describes an indirect object of the activity from which the activity is directed. - /// - /// The precise meaning of the origin is the object of the English preposition "from". For - /// instance, in the activity "John moved an item to List B from List A", the origin of the - /// activity is "List A". - /// - /// - Range: Object | Link - /// - Functional: false - #[serde(skip_serializing_if = "Option::is_none")] - origin: Option>, - - /// Describes the indirect object, or target, of the activity. - /// - /// The precise meaning of the target is largely dependent on the type of action being - /// described but will often be the object of the English preposition "to". For instance, in - /// the activity "John added a movie to his wishlist", the target of the activity is John's - /// wishlist. An activity can have more than one target - /// - /// - Range: Object | Link - /// - Functional: false - #[serde(skip_serializing_if = "Option::is_none")] - target: Option>, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} - -/// Activity with actor, object, and optional target properties -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct ActorAndObjectOptTarget { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// When used within an Activity, describes the direct object of the activity. - /// - /// For instance, in the activity "John added a movie to his wishlist", the object of the - /// activity is the movie added. - /// - /// - Range: Object | Link - /// - Functional: false - object: OneOrMany, - - /// Describes the indirect object, or target, of the activity. - /// - /// The precise meaning of the target is largely dependent on the type of action being - /// described but will often be the object of the English preposition "to". For instance, in - /// the activity "John added a movie to his wishlist", the target of the activity is John's - /// wishlist. An activity can have more than one target - /// - /// - Range: Object | Link - /// - Functional: false - #[serde(skip_serializing_if = "Option::is_none")] - target: Option>, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} +pub type Delete = ActorAndObjectOptOrigin; /// Indicates that the actor is traveling to target from origin. /// /// Travel is an IntransitiveObject whose actor specifies the direct object. If the target or /// origin are not specified, either can be determined by context. -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Travel { - /// Describes one or more entities that either performed or are expected to perform the - /// activity. - /// - /// Any single activity can have multiple actors. The actor MAY be specified using an indirect - /// Link. - /// - /// - Range: Object | Link - /// - Functional: false - actor: OneOrMany, - - /// Describes an indirect object of the activity from which the activity is directed. - /// - /// The precise meaning of the origin is the object of the English preposition "from". For - /// instance, in the activity "John moved an item to List B from List A", the origin of the - /// activity is "List A". - /// - /// - Range: Object | Link - /// - Functional: false - #[serde(skip_serializing_if = "Option::is_none")] - origin: Option>, - - /// Describes the indirect object, or target, of the activity. - /// - /// The precise meaning of the target is largely dependent on the type of action being - /// described but will often be the object of the English preposition "to". For instance, in - /// the activity "John added a movie to his wishlist", the target of the activity is John's - /// wishlist. An activity can have more than one target - /// - /// - Range: Object | Link - /// - Functional: false - #[serde(skip_serializing_if = "Option::is_none")] - target: Option>, - - /// base fields and unparsed json ends up here - #[serde(flatten)] - inner: Activity, -} +pub type Travel = OptOrigin>>>; /// Represents a question being asked. /// @@ -2132,6 +1858,151 @@ pub struct Question { inner: Activity, } +/// Activity with actor and object properties +pub type ActorAndObject = ActivityActor>>; + +/// Activity with actor and origin properties +pub type ActorAndOrigin = Origin>>; + +/// Activity with actor and object properties, and optional origin and target properties +pub type ActorAndObjectOptOriginAndTarget = OptOrigin>>; + +/// Activity with actor and object properties, and and optional origin property +pub type ActorAndObjectOptOrigin = OptOrigin>; + +/// Activity with actor and object properties, and and optional target property +pub type ActorAndObjectOptTarget = OptTarget>; + +/// Activity objects are specializations of the base Object type that provide information about +/// actions that have either already occurred, are in the process of occurring, or may occur in the +/// future. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Activity { + /// Describes the result of the activity. + /// + /// For instance, if a particular action results in the creation of a new resource, the result + /// property can be used to describe that new resource. + /// + /// - Range: Object | Link + /// - Funcitonal: false + #[serde(skip_serializing_if = "Option::is_none")] + result: Option>, + + /// Identifies one or more objects used (or to be used) in the completion of an Activity. + /// + /// - Range: Object | Link + /// - Funcitonal: false + #[serde(skip_serializing_if = "Option::is_none")] + instrument: Option>, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Object, +} + +/// Activity with an actor property +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ActivityActor { + actor: OneOrMany, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Inner, +} + +/// Activity with an object property +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ActivityObject { + object: OneOrMany, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Inner, +} + +/// Activity with an origin property +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Origin { + /// Describes an indirect object of the activity from which the activity is directed. + /// + /// The precise meaning of the origin is the object of the English preposition "from". For + /// instance, in the activity "John moved an item to List B from List A", the origin of the + /// activity is "List A". + /// + /// - Range: Object | Link + /// - Functional: false + origin: OneOrMany, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Inner, +} + +/// Activity with an optional origin property +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct OptOrigin { + /// Describes an indirect object of the activity from which the activity is directed. + /// + /// The precise meaning of the origin is the object of the English preposition "from". For + /// instance, in the activity "John moved an item to List B from List A", the origin of the + /// activity is "List A". + /// + /// - Range: Object | Link + /// - Functional: false + #[serde(skip_serializing_if = "Option::is_none")] + origin: Option>, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Inner, +} + +/// Activity with a target property +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Target { + /// Describes the indirect object, or target, of the activity. + /// + /// The precise meaning of the target is largely dependent on the type of action being + /// described but will often be the object of the English preposition "to". For instance, in + /// the activity "John added a movie to his wishlist", the target of the activity is John's + /// wishlist. An activity can have more than one target + /// + /// - Range: Object | Link + /// - Functional: false + target: OneOrMany, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Inner, +} + +/// Activity with an optional target property +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct OptTarget { + /// Describes the indirect object, or target, of the activity. + /// + /// The precise meaning of the target is largely dependent on the type of action being + /// described but will often be the object of the English preposition "to". For instance, in + /// the activity "John added a movie to his wishlist", the target of the activity is John's + /// wishlist. An activity can have more than one target + /// + /// - Range: Object | Link + /// - Functional: false + #[serde(skip_serializing_if = "Option::is_none")] + target: Option>, + + /// base fields and unparsed json ends up here + #[serde(flatten)] + inner: Inner, +} + impl Activity { /// Create a new Activity /// @@ -2201,6 +2072,226 @@ impl Activity { } } +impl ActivityActor { + fn extending(mut inner: Inner) -> Result + where + Inner: UnparsedMut, + { + let actor = inner.remove("actor")?; + + Ok(ActivityActor { actor, inner }) + } + + fn retracting(self) -> Result + where + Inner: UnparsedMut, + { + let ActivityActor { actor, mut inner } = self; + + inner.insert("actor", actor)?; + + Ok(inner) + } +} + +impl ActivityObject { + fn extending(mut inner: Inner) -> Result + where + Inner: UnparsedMut, + { + let object = inner.remove("object")?; + + Ok(ActivityObject { object, inner }) + } + + fn retracting(self) -> Result + where + Inner: UnparsedMut, + { + let ActivityObject { object, mut inner } = self; + + inner.insert("object", object)?; + + Ok(inner) + } +} + +impl Arrive { + pub fn new(actor: T, origin: U) -> Self + where + T: Into>, + U: Into>, + { + Origin { + origin: origin.into(), + inner: ActivityActor { + actor: actor.into(), + inner: Activity::new(), + }, + } + } + + /// Deconstruct the Arrive into its parts + /// + /// ```rust + /// use activitystreams::activity::Arrive; + /// + /// let activity = Arrive::new(vec![], vec![]); + /// + /// let (actor, origin, activity) = activity.into_parts(); + /// ``` + pub fn into_parts(self) -> (OneOrMany, OneOrMany, Activity) { + (self.inner.actor, self.origin, self.inner.inner) + } +} + +impl Invite { + pub fn new(actor: T, object: U, target: V) -> Self + where + T: Into>, + U: Into>, + V: Into>, + { + Target { + target: target.into(), + inner: ActivityActor { + actor: actor.into(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new(), + }, + }, + } + } + + /// Deconstruct the Invite into its parts + /// + /// ```rust + /// use activitystreams::activity::Invite; + /// + /// let activity = Invite::new(vec![], vec![], vec![]); + /// + /// let (actor, object, target, activity) = activity.into_parts(); + /// ``` + pub fn into_parts( + self, + ) -> ( + OneOrMany, + OneOrMany, + OneOrMany, + Activity, + ) { + ( + self.inner.actor, + self.inner.inner.object, + self.target, + self.inner.inner.inner, + ) + } +} + +impl Delete { + /// Create a new Delete Activity + /// + /// ```rust + /// use activitystreams::activity::Delete; + /// + /// let activity = Delete::new(vec![], vec![]); + /// ``` + pub fn new(actor: T, object: U) -> Self + where + T: Into>, + U: Into>, + { + OptOrigin { + origin: None, + inner: ActivityActor { + actor: actor.into(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new(), + }, + }, + } + } + + /// Deconstruct the Delete into its parts + /// + /// ```rust + /// use activitystreams::activity::Delete; + /// + /// let activity = Delete::new(vec![], vec![]); + /// + /// let (actor, object, origin, activity) = activity.into_parts(); + /// ``` + pub fn into_parts( + self, + ) -> ( + OneOrMany, + OneOrMany, + Option>, + Activity, + ) { + ( + self.inner.actor, + self.inner.inner.object, + self.origin, + self.inner.inner.inner, + ) + } +} + +impl Travel { + /// Create a new Travel Activity + /// + /// ```rust + /// use activitystreams::activity::Travel; + /// + /// let activity = Travel::new(vec![]); + /// ``` + pub fn new(actor: T) -> Self + where + T: Into>, + { + OptOrigin { + origin: None, + inner: OptTarget { + target: None, + inner: ActivityActor { + actor: actor.into(), + inner: Activity::new(), + }, + }, + } + } + + #[allow(clippy::type_complexity)] + /// Deconstruct the Travel into its parts + /// + /// ```rust + /// use activitystreams::activity::Travel; + /// + /// let activity = Travel::new(vec![]); + /// + /// let (actor, origin, target, activity) = activity.into_parts(); + /// ``` + pub fn into_parts( + self, + ) -> ( + OneOrMany, + Option>, + Option>, + Activity, + ) { + ( + self.inner.inner.actor, + self.origin, + self.inner.target, + self.inner.inner.inner, + ) + } +} + impl ActorAndObject { /// Create a new ActorAndObject Activity /// @@ -2215,10 +2306,12 @@ impl ActorAndObject { U: Into>, Kind: Default, { - ActorAndObject { + ActivityActor { actor: actor.into(), - object: object.into(), - inner: Activity::new(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new(), + }, } } @@ -2243,10 +2336,12 @@ impl ActorAndObject { T: Into>, U: Into>, { - ActorAndObject { + ActivityActor { actor: actor.into(), - object: object.into(), - inner: Activity::new_none_type(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new_none_type(), + }, } } @@ -2260,248 +2355,17 @@ impl ActorAndObject { /// let (actor, object, activity) = activity.into_parts(); /// ``` pub fn into_parts(self) -> (OneOrMany, OneOrMany, Activity) { - (self.actor, self.object, self.inner) - } - - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let object = inner.remove("object")?; - - Ok(ActorAndObject { - actor, - object, - inner, - }) - } - - fn retracting(self) -> Result, serde_json::Error> { - let ActorAndObject { - actor, - object, - mut inner, - } = self; - - inner.insert("actor", actor)?.insert("object", object)?; - - inner.retracting() + (self.actor, self.inner.object, self.inner.inner) } } -impl Arrive { - /// Create a new Arrive Activity +impl ActorAndObjectOptTarget { + /// Create a new ActorAndObjectOptTarget Activity /// /// ```rust - /// use activitystreams::activity::Arrive; + /// use activitystreams::activity::ActorAndObjectOptTarget; /// - /// let activity = Arrive::new(vec![], vec![]); - /// ``` - pub fn new(actor: T, origin: U) -> Self - where - T: Into>, - U: Into>, - { - Arrive { - actor: actor.into(), - origin: origin.into(), - inner: Activity::new(), - } - } - - /// Deconstruct the Arrive into its parts - /// - /// ```rust - /// use activitystreams::activity::Arrive; - /// - /// let activity = Arrive::new(vec![], vec![]); - /// - /// let (actor, origin, activity) = activity.into_parts(); - /// ``` - pub fn into_parts(self) -> (OneOrMany, OneOrMany, Activity) { - (self.actor, self.origin, self.inner) - } - - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let origin = inner.remove("origin")?; - - Ok(Arrive { - actor, - origin, - inner, - }) - } - - fn retracting(self) -> Result, serde_json::Error> { - let Arrive { - actor, - origin, - mut inner, - } = self; - - inner.insert("actor", actor)?.insert("origin", origin)?; - - inner.retracting() - } -} - -impl Invite { - /// Create a new Invite Activity - /// - /// ```rust - /// use activitystreams::activity::Invite; - /// - /// let activity = Invite::new(vec![], vec![], vec![]); - /// ``` - pub fn new(actor: T, object: U, target: V) -> Self - where - T: Into>, - U: Into>, - V: Into>, - { - Invite { - actor: actor.into(), - object: object.into(), - target: target.into(), - inner: Activity::new(), - } - } - - /// Deconstruct the Invite into its parts - /// - /// ```rust - /// use activitystreams::activity::Invite; - /// - /// let activity = Invite::new(vec![], vec![], vec![]); - /// - /// let (actor, object, target, activity) = activity.into_parts(); - /// ``` - pub fn into_parts( - self, - ) -> ( - OneOrMany, - OneOrMany, - OneOrMany, - Activity, - ) { - (self.actor, self.object, self.target, self.inner) - } - - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let object = inner.remove("object")?; - let target = inner.remove("target")?; - - Ok(Invite { - actor, - object, - target, - inner, - }) - } - - fn retracting(self) -> Result, serde_json::Error> { - let Invite { - actor, - object, - target, - mut inner, - } = self; - - inner - .insert("actor", actor)? - .insert("object", object)? - .insert("target", target)?; - - inner.retracting() - } -} - -impl Delete { - /// Create a new Delete Activity - /// - /// ```rust - /// use activitystreams::activity::Delete; - /// - /// let activity = Delete::new(vec![], vec![]); - /// ``` - pub fn new(actor: T, object: U) -> Self - where - T: Into>, - U: Into>, - { - Delete { - actor: actor.into(), - object: object.into(), - origin: None, - inner: Activity::new(), - } - } - - /// Deconstruct the Delete into its parts - /// - /// ```rust - /// use activitystreams::activity::Delete; - /// - /// let activity = Delete::new(vec![], vec![]); - /// - /// let (actor, object, origin, activity) = activity.into_parts(); - /// ``` - pub fn into_parts( - self, - ) -> ( - OneOrMany, - OneOrMany, - Option>, - Activity, - ) { - (self.actor, self.object, self.origin, self.inner) - } - - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let object = inner.remove("object")?; - let origin = inner.remove("origin")?; - - Ok(Delete { - actor, - object, - origin, - inner, - }) - } - - fn retracting(self) -> Result, serde_json::Error> { - let Delete { - actor, - object, - origin, - mut inner, - } = self; - - inner - .insert("actor", actor)? - .insert("object", object)? - .insert("origin", origin)?; - - inner.retracting() - } -} - -impl ActorAndObjectOptOriginAndTarget { - /// Create a new ActorAndObjectOptOriginAndTarget Activity - /// - /// ```rust - /// use activitystreams::activity::ActorAndObjectOptOriginAndTarget; - /// - /// let activity = ActorAndObjectOptOriginAndTarget::::new( + /// let activity = ActorAndObjectOptTarget::::new( /// vec![], /// vec![] /// ); @@ -2512,16 +2376,108 @@ impl ActorAndObjectOptOriginAndTarget { U: Into>, Kind: Default, { - ActorAndObjectOptOriginAndTarget { - actor: actor.into(), - object: object.into(), - origin: None, + OptTarget { target: None, - inner: Activity::new(), + inner: ActivityActor { + actor: actor.into(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new(), + }, + }, } } - /// Create a new ActorAndObjectOptOriginAndTarget with `None` for it's `kind` property + /// Create a new ActorAndObject with `None` for it's `kind` property + /// + /// This means that no `type` field will be present in serialized JSON + /// + /// ```rust + /// # fn main() -> Result<(), anyhow::Error> { + /// use activitystreams::activity::ActorAndObjectOptTarget; + /// + /// let activity = ActorAndObjectOptTarget::<()>::new_none_type(vec![], vec![]); + /// + /// let s = serde_json::to_string(&activity)?; + /// + /// assert_eq!(s, r#"{"actor":[],"object":[]}"#); + /// # Ok(()) + /// # } + /// ``` + pub fn new_none_type(actor: T, object: U) -> Self + where + T: Into>, + U: Into>, + { + OptTarget { + target: None, + inner: ActivityActor { + actor: actor.into(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new_none_type(), + }, + }, + } + } + + #[allow(clippy::type_complexity)] + /// Deconstruct the ActorAndObjectOptTarget into its parts + /// + /// ```rust + /// use activitystreams::activity::ActorAndObjectOptTarget; + /// + /// let activity = ActorAndObjectOptTarget::::new(vec![], vec![]); + /// + /// let (actor, object, target, activity) = activity.into_parts(); + /// ``` + pub fn into_parts( + self, + ) -> ( + OneOrMany, + OneOrMany, + Option>, + Activity, + ) { + ( + self.inner.actor, + self.inner.inner.object, + self.target, + self.inner.inner.inner, + ) + } +} + +impl ActorAndObjectOptOriginAndTarget { + /// Create a new ActorAndObject Activity + /// + /// ```rust + /// use activitystreams::activity::ActorAndObjectOptOriginAndTarget; + /// + /// let activity = ActorAndObjectOptOriginAndTarget::::new(vec![], vec![]); + /// ``` + pub fn new(actor: T, object: U) -> Self + where + T: Into>, + U: Into>, + Kind: Default, + { + OptOrigin { + origin: None, + inner: OptTarget { + target: None, + inner: ActivityActor { + actor: actor.into(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new(), + }, + }, + }, + } + } + + /// Create a new ActorAndObject with `None` for it's `kind` property /// /// This means that no `type` field will be present in serialized JSON /// @@ -2542,12 +2498,18 @@ impl ActorAndObjectOptOriginAndTarget { T: Into>, U: Into>, { - ActorAndObjectOptOriginAndTarget { - actor: actor.into(), - object: object.into(), + OptOrigin { origin: None, - target: None, - inner: Activity::new_none_type(), + inner: OptTarget { + target: None, + inner: ActivityActor { + actor: actor.into(), + inner: ActivityObject { + object: object.into(), + inner: Activity::new_none_type(), + }, + }, + }, } } @@ -2571,226 +2533,100 @@ impl ActorAndObjectOptOriginAndTarget { Activity, ) { ( - self.actor, - self.object, + self.inner.inner.actor, + self.inner.inner.inner.object, self.origin, - self.target, - self.inner, + self.inner.target, + self.inner.inner.inner.inner, ) } +} - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let object = inner.remove("object")?; +impl Origin { + fn extending(mut inner: Inner) -> Result + where + Inner: UnparsedMut, + { let origin = inner.remove("origin")?; - let target = inner.remove("target")?; - Ok(ActorAndObjectOptOriginAndTarget { - actor, - object, - origin, - target, - inner, - }) + Ok(Origin { origin, inner }) } - fn retracting(self) -> Result, serde_json::Error> { - let ActorAndObjectOptOriginAndTarget { - actor, - object, - origin, - target, - mut inner, - } = self; + fn retracting(self) -> Result + where + Inner: UnparsedMut, + { + let Origin { origin, mut inner } = self; - inner - .insert("actor", actor)? - .insert("object", object)? - .insert("origin", origin)? - .insert("target", target)?; + inner.insert("origin", origin)?; - inner.retracting() + Ok(inner) } } -impl ActorAndObjectOptTarget { - /// Create a new ActorAndObjectOptTarget Activity - /// - /// ```rust - /// use activitystreams::activity::ActorAndObjectOptTarget; - /// - /// let activity = ActorAndObjectOptTarget::::new( - /// vec![], - /// vec![] - /// ); - /// ``` - pub fn new(actor: T, object: U) -> Self +impl OptOrigin { + fn extending(mut inner: Inner) -> Result where - T: Into>, - U: Into>, - Kind: Default, + Inner: UnparsedMut, { - ActorAndObjectOptTarget { - actor: actor.into(), - object: object.into(), - target: None, - inner: Activity::new(), - } + let origin = inner.remove("origin")?; + + Ok(OptOrigin { origin, inner }) } - /// Create a new ActorAndObjectOptTarget with `None` for it's `kind` property - /// - /// This means that no `type` field will be present in serialized JSON - /// - /// ```rust - /// # fn main() -> Result<(), anyhow::Error> { - /// use activitystreams::activity::ActorAndObjectOptTarget; - /// - /// let activity = ActorAndObjectOptTarget::<()>::new_none_type(vec![], vec![]); - /// - /// let s = serde_json::to_string(&activity)?; - /// - /// assert_eq!(s, r#"{"actor":[],"object":[]}"#); - /// # Ok(()) - /// # } - /// ``` - pub fn new_none_type(actor: T, object: U) -> Self + fn retracting(self) -> Result where - T: Into>, - U: Into>, + Inner: UnparsedMut, { - ActorAndObjectOptTarget { - actor: actor.into(), - object: object.into(), - target: None, - inner: Activity::new_none_type(), - } - } + let OptOrigin { origin, mut inner } = self; - /// Deconstruct the ActorAndObjectOptTarget into its parts - /// - /// ```rust - /// use activitystreams::activity::ActorAndObjectOptTarget; - /// - /// let activity = ActorAndObjectOptTarget::::new(vec![], vec![]); - /// - /// let (actor, object, target, activity) = activity.into_parts(); - /// ``` - pub fn into_parts( - self, - ) -> ( - OneOrMany, - OneOrMany, - Option>, - Activity, - ) { - (self.actor, self.object, self.target, self.inner) - } + inner.insert("origin", origin)?; - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let object = inner.remove("object")?; - let target = inner.remove("target")?; - - Ok(ActorAndObjectOptTarget { - actor, - object, - target, - inner, - }) - } - - fn retracting(self) -> Result, serde_json::Error> { - let ActorAndObjectOptTarget { - actor, - object, - target, - mut inner, - } = self; - - inner - .insert("actor", actor)? - .insert("object", object)? - .insert("target", target)?; - - inner.retracting() + Ok(inner) } } -impl Travel { - /// Create a new Travel Activity - /// - /// ```rust - /// use activitystreams::activity::Travel; - /// - /// let activity = Travel::new(vec![]); - /// ``` - pub fn new(actor: T) -> Self +impl Target { + fn extending(mut inner: Inner) -> Result where - T: Into>, + Inner: UnparsedMut, { - Travel { - actor: actor.into(), - origin: None, - target: None, - inner: Activity::new(), - } - } - - #[allow(clippy::type_complexity)] - /// Deconstruct the Travel into its parts - /// - /// ```rust - /// use activitystreams::activity::Travel; - /// - /// let activity = Travel::new(vec![]); - /// - /// let (actor, origin, target, activity) = activity.into_parts(); - /// ``` - pub fn into_parts( - self, - ) -> ( - OneOrMany, - Option>, - Option>, - Activity, - ) { - (self.actor, self.origin, self.target, self.inner) - } - - fn extending(object: Object) -> Result { - let mut inner = Activity::extending(object)?; - - let actor = inner.remove("actor")?; - let origin = inner.remove("origin")?; let target = inner.remove("target")?; - Ok(Travel { - actor, - origin, - target, - inner, - }) + Ok(Target { target, inner }) } - fn retracting(self) -> Result, serde_json::Error> { - let Travel { - actor, - origin, - target, - mut inner, - } = self; + fn retracting(self) -> Result + where + Inner: UnparsedMut, + { + let Target { target, mut inner } = self; - inner - .insert("actor", actor)? - .insert("origin", origin)? - .insert("target", target)?; + inner.insert("target", target)?; - inner.retracting() + Ok(inner) + } +} + +impl OptTarget { + fn extending(mut inner: Inner) -> Result + where + Inner: UnparsedMut, + { + let target = inner.remove("target")?; + + Ok(OptTarget { target, inner }) + } + + fn retracting(self) -> Result + where + Inner: UnparsedMut, + { + let OptTarget { target, mut inner } = self; + + inner.insert("target", target)?; + + Ok(inner) } } @@ -2866,39 +2702,60 @@ impl markers::Base for Activity {} impl markers::Object for Activity {} impl markers::Activity for Activity {} -impl markers::Base for ActorAndObject {} -impl markers::Object for ActorAndObject {} -impl markers::Activity for ActorAndObject {} +impl markers::Base for ActivityActor where Inner: markers::Base {} +impl markers::Object for ActivityActor where Inner: markers::Object {} +impl markers::Activity for ActivityActor where Inner: markers::Activity {} +impl markers::IntransitiveActivity for ActivityActor where + Inner: markers::IntransitiveActivity +{ +} -impl markers::Base for ActorAndObjectOptTarget {} -impl markers::Object for ActorAndObjectOptTarget {} -impl markers::Activity for ActorAndObjectOptTarget {} +impl markers::Base for ActivityObject where Inner: markers::Base {} +impl markers::Object for ActivityObject where Inner: markers::Object {} +impl markers::Activity for ActivityObject where Inner: markers::Activity {} +impl markers::IntransitiveActivity for ActivityObject where + Inner: markers::IntransitiveActivity +{ +} -impl markers::Base for ActorAndObjectOptOriginAndTarget {} -impl markers::Object for ActorAndObjectOptOriginAndTarget {} -impl markers::Activity for ActorAndObjectOptOriginAndTarget {} +impl markers::Base for Target where Inner: markers::Base {} +impl markers::Object for Target where Inner: markers::Object {} +impl markers::Activity for Target where Inner: markers::Activity {} +impl markers::IntransitiveActivity for Target where + Inner: markers::IntransitiveActivity +{ +} -impl markers::Base for Arrive {} -impl markers::Object for Arrive {} -impl markers::Activity for Arrive {} -impl markers::IntransitiveActivity for Arrive {} +impl markers::Base for OptTarget where Inner: markers::Base {} +impl markers::Object for OptTarget where Inner: markers::Object {} +impl markers::Activity for OptTarget where Inner: markers::Activity {} +impl markers::IntransitiveActivity for OptTarget where + Inner: markers::IntransitiveActivity +{ +} -impl markers::Base for Invite {} -impl markers::Object for Invite {} -impl markers::Activity for Invite {} +impl markers::Base for Origin where Inner: markers::Base {} +impl markers::Object for Origin where Inner: markers::Object {} +impl markers::Activity for Origin where Inner: markers::Activity {} +impl markers::IntransitiveActivity for Origin where + Inner: markers::IntransitiveActivity +{ +} -impl markers::Base for Delete {} -impl markers::Object for Delete {} -impl markers::Activity for Delete {} - -impl markers::Base for Travel {} -impl markers::Object for Travel {} -impl markers::Activity for Travel {} -impl markers::IntransitiveActivity for Travel {} +impl markers::Base for OptOrigin where Inner: markers::Base {} +impl markers::Object for OptOrigin where Inner: markers::Object {} +impl markers::Activity for OptOrigin where Inner: markers::Activity {} +impl markers::IntransitiveActivity for OptOrigin where + Inner: markers::IntransitiveActivity +{ +} impl markers::Base for Question {} impl markers::Object for Question {} impl markers::Activity for Question {} + +impl markers::IntransitiveActivity for Arrive {} +impl markers::IntransitiveActivity for Travel {} impl markers::IntransitiveActivity for Question {} impl markers::Activity for ApObject where Inner: markers::Activity {} @@ -2907,15 +2764,17 @@ impl markers::IntransitiveActivity for ApObject where { } -impl Extends for Activity { +impl Extends for Activity { + type Kind = Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let inner = Object::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } @@ -2937,217 +2796,273 @@ impl TryFrom> for Object { } } -impl Extends for ActorAndObject { +impl Extends for ActivityActor +where + Inner: Extends + UnparsedMut, +{ + type Kind = Inner::Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; + fn extends(base: Base) -> Result { + let inner = Inner::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } } -impl TryFrom> for ActorAndObject { +impl TryFrom> for ActivityActor +where + Inner: TryFrom, Error = serde_json::Error> + UnparsedMut, +{ type Error = serde_json::Error; fn try_from(object: Object) -> Result { - Self::extending(object) + let inner = Inner::try_from(object)?; + Self::extending(inner) } } -impl TryFrom> for Object { +impl TryFrom> for Object +where + Object: TryFrom, + Inner: UnparsedMut, +{ type Error = serde_json::Error; - fn try_from(activity: ActorAndObject) -> Result { - activity.retracting() + fn try_from(activity: ActivityActor) -> Result { + let inner = activity.retracting()?; + TryFrom::try_from(inner) } } -impl Extends for Arrive { +impl Extends for ActivityObject +where + Inner: Extends + UnparsedMut, +{ + type Kind = Inner::Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; + fn extends(base: Base) -> Result { + let inner = Inner::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } } -impl TryFrom> for Arrive { - type Error = serde_json::Error; - - fn try_from(object: Object) -> Result { - Self::extending(object) - } -} - -impl TryFrom for Object { - type Error = serde_json::Error; - - fn try_from(arrive: Arrive) -> Result { - arrive.retracting() - } -} - -impl Extends for Invite { - type Error = serde_json::Error; - - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; - Self::extending(inner) - } - - fn retracts(self) -> Result, Self::Error> { - let inner = self.retracting()?; - inner.retracts() - } -} - -impl TryFrom> for Invite { - type Error = serde_json::Error; - - fn try_from(object: Object) -> Result { - Self::extending(object) - } -} - -impl TryFrom for Object { - type Error = serde_json::Error; - - fn try_from(invite: Invite) -> Result { - invite.retracting() - } -} - -impl Extends for Delete { - type Error = serde_json::Error; - - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; - Self::extending(inner) - } - - fn retracts(self) -> Result, Self::Error> { - let inner = self.retracting()?; - inner.retracts() - } -} - -impl TryFrom> for Delete { - type Error = serde_json::Error; - - fn try_from(object: Object) -> Result { - Self::extending(object) - } -} - -impl TryFrom for Object { - type Error = serde_json::Error; - - fn try_from(delete: Delete) -> Result { - delete.retracting() - } -} - -impl Extends for ActorAndObjectOptOriginAndTarget { - type Error = serde_json::Error; - - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; - Self::extending(inner) - } - - fn retracts(self) -> Result, Self::Error> { - let inner = self.retracting()?; - inner.retracts() - } -} - -impl TryFrom> for ActorAndObjectOptOriginAndTarget { +impl TryFrom> for ActivityObject +where + Inner: TryFrom, Error = serde_json::Error> + UnparsedMut, +{ type Error = serde_json::Error; fn try_from(object: Object) -> Result { - Self::extending(object) + let inner = Inner::try_from(object)?; + Self::extending(inner) } } -impl TryFrom> for Object { +impl TryFrom> for Object +where + Object: TryFrom, + Inner: UnparsedMut, +{ type Error = serde_json::Error; - fn try_from(activity: ActorAndObjectOptOriginAndTarget) -> Result { - activity.retracting() + fn try_from(activity: ActivityObject) -> Result { + let inner = activity.retracting()?; + TryFrom::try_from(inner) } } -impl Extends for ActorAndObjectOptTarget { +impl Extends for Origin +where + Inner: Extends + UnparsedMut, +{ + type Kind = Inner::Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; + fn extends(base: Base) -> Result { + let inner = Inner::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } } -impl TryFrom> for ActorAndObjectOptTarget { +impl TryFrom> for Origin +where + Inner: TryFrom, Error = serde_json::Error> + UnparsedMut, +{ type Error = serde_json::Error; fn try_from(object: Object) -> Result { - Self::extending(object) + let inner = Inner::try_from(object)?; + Self::extending(inner) } } -impl TryFrom> for Object { +impl TryFrom> for Object +where + Object: TryFrom, + Inner: UnparsedMut, +{ type Error = serde_json::Error; - fn try_from(activity: ActorAndObjectOptTarget) -> Result { - activity.retracting() + fn try_from(activity: Origin) -> Result { + let inner = activity.retracting()?; + TryFrom::try_from(inner) } } -impl Extends for Travel { +impl Extends for OptOrigin +where + Inner: Extends + UnparsedMut, +{ + type Kind = Inner::Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { - let inner = Object::extends(base)?; + fn extends(base: Base) -> Result { + let inner = Inner::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } } -impl TryFrom> for Travel { +impl TryFrom> for OptOrigin +where + Inner: TryFrom, Error = serde_json::Error> + UnparsedMut, +{ type Error = serde_json::Error; - fn try_from(object: Object) -> Result { - Self::extending(object) + fn try_from(object: Object) -> Result { + let inner = Inner::try_from(object)?; + Self::extending(inner) } } -impl TryFrom for Object { +impl TryFrom> for Object +where + Object: TryFrom, + Inner: UnparsedMut, +{ type Error = serde_json::Error; - fn try_from(travel: Travel) -> Result { - travel.retracting() + fn try_from(activity: OptOrigin) -> Result { + let inner = activity.retracting()?; + TryFrom::try_from(inner) } } -impl Extends for Question { +impl Extends for Target +where + Inner: Extends + UnparsedMut, +{ + type Kind = Inner::Kind; + + type Error = serde_json::Error; + + fn extends(base: Base) -> Result { + let inner = Inner::extends(base)?; + Self::extending(inner) + } + + fn retracts(self) -> Result, Self::Error> { + let inner = self.retracting()?; + inner.retracts() + } +} + +impl TryFrom> for Target +where + Inner: TryFrom, Error = serde_json::Error> + UnparsedMut, +{ + type Error = serde_json::Error; + + fn try_from(object: Object) -> Result { + let inner = Inner::try_from(object)?; + Self::extending(inner) + } +} + +impl TryFrom> for Object +where + Object: TryFrom, + Inner: UnparsedMut, +{ + type Error = serde_json::Error; + + fn try_from(activity: Target) -> Result { + let inner = activity.retracting()?; + TryFrom::try_from(inner) + } +} + +impl Extends for OptTarget +where + Inner: Extends + UnparsedMut, +{ + type Kind = Inner::Kind; + + type Error = serde_json::Error; + + fn extends(base: Base) -> Result { + let inner = Inner::extends(base)?; + Self::extending(inner) + } + + fn retracts(self) -> Result, Self::Error> { + let inner = self.retracting()?; + inner.retracts() + } +} + +impl TryFrom> for OptTarget +where + Inner: TryFrom, Error = serde_json::Error> + UnparsedMut, +{ + type Error = serde_json::Error; + + fn try_from(object: Object) -> Result { + let inner = Inner::try_from(object)?; + Self::extending(inner) + } +} + +impl TryFrom> for Object +where + Object: TryFrom, + Inner: UnparsedMut, +{ + type Error = serde_json::Error; + + fn try_from(activity: OptTarget) -> Result { + let inner = activity.retracting()?; + TryFrom::try_from(inner) + } +} + +impl Extends for Question { + type Kind = QuestionType; + type Error = serde_json::Error; fn extends(base: Base) -> Result { @@ -3183,43 +3098,55 @@ impl UnparsedMut for Activity { } } -impl UnparsedMut for ActorAndObject { +impl UnparsedMut for ActivityActor +where + Inner: UnparsedMut, +{ fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } -impl UnparsedMut for Arrive { +impl UnparsedMut for ActivityObject +where + Inner: UnparsedMut, +{ fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } -impl UnparsedMut for Invite { +impl UnparsedMut for Origin +where + Inner: UnparsedMut, +{ fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } -impl UnparsedMut for Delete { +impl UnparsedMut for OptOrigin +where + Inner: UnparsedMut, +{ fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } -impl UnparsedMut for ActorAndObjectOptOriginAndTarget { +impl UnparsedMut for Target +where + Inner: UnparsedMut, +{ fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } -impl UnparsedMut for ActorAndObjectOptTarget { - fn unparsed_mut(&mut self) -> &mut Unparsed { - self.inner.unparsed_mut() - } -} - -impl UnparsedMut for Travel { +impl UnparsedMut for OptTarget +where + Inner: UnparsedMut, +{ fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } @@ -3231,437 +3158,795 @@ impl UnparsedMut for Question { } } -impl AsBase for Activity { - fn base_ref(&self) -> &Base { +impl AsBase for Activity { + type Kind = Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Activity { - fn object_ref(&self) -> &Object { - &self.inner +impl AsObject for Activity { + type Kind = Kind; + + fn object_ref(&self) -> &Object { + self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { - &mut self.inner + fn object_mut(&mut self) -> &mut Object { + self.inner.object_mut() } } -impl AsActivity for Activity { - fn activity_ref(&self) -> &Activity { +impl AsActivity for Activity { + type Kind = Kind; + + fn activity_ref(&self) -> &Activity { self } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self } } -impl AsBase for ActorAndObject { - fn base_ref(&self) -> &Base { +impl AsBase for ActivityActor +where + Inner: AsBase, +{ + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for ActorAndObject { - fn object_ref(&self) -> &Object { +impl AsObject for ActivityActor +where + Inner: AsObject, +{ + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } -impl AsActivity for ActorAndObject { - fn activity_ref(&self) -> &Activity { - &self.inner - } +impl AsActivity for ActivityActor +where + Inner: AsActivity, +{ + type Kind = Inner::Kind; - fn activity_mut(&mut self) -> &mut Activity { - &mut self.inner - } -} - -impl ActorAndObjectRef for ActorAndObject { - fn actor_field_ref(&self) -> &OneOrMany { - &self.actor - } - - fn object_field_ref(&self) -> &OneOrMany { - &self.object - } - - fn actor_field_mut(&mut self) -> &mut OneOrMany { - &mut self.actor - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - &mut self.object - } -} - -impl AsBase for ActorAndObjectOptTarget { - fn base_ref(&self) -> &Base { - self.inner.base_ref() - } - - fn base_mut(&mut self) -> &mut Base { - self.inner.base_mut() - } -} - -impl AsObject for ActorAndObjectOptTarget { - fn object_ref(&self) -> &Object { - self.inner.object_ref() - } - - fn object_mut(&mut self) -> &mut Object { - self.inner.object_mut() - } -} - -impl AsActivity for ActorAndObjectOptTarget { - fn activity_ref(&self) -> &Activity { - &self.inner - } - - fn activity_mut(&mut self) -> &mut Activity { - &mut self.inner - } -} - -impl ActorAndObjectRef for ActorAndObjectOptTarget { - fn actor_field_ref(&self) -> &OneOrMany { - &self.actor - } - - fn object_field_ref(&self) -> &OneOrMany { - &self.object - } - - fn actor_field_mut(&mut self) -> &mut OneOrMany { - &mut self.actor - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - &mut self.object - } -} - -impl OptTargetRef for ActorAndObjectOptTarget { - fn target_field_ref(&self) -> &Option> { - &self.target - } - - fn target_field_mut(&mut self) -> &mut Option> { - &mut self.target - } -} - -impl AsBase for ActorAndObjectOptOriginAndTarget { - fn base_ref(&self) -> &Base { - self.inner.base_ref() - } - - fn base_mut(&mut self) -> &mut Base { - self.inner.base_mut() - } -} - -impl AsObject for ActorAndObjectOptOriginAndTarget { - fn object_ref(&self) -> &Object { - self.inner.object_ref() - } - - fn object_mut(&mut self) -> &mut Object { - self.inner.object_mut() - } -} - -impl AsActivity for ActorAndObjectOptOriginAndTarget { - fn activity_ref(&self) -> &Activity { - &self.inner - } - - fn activity_mut(&mut self) -> &mut Activity { - &mut self.inner - } -} - -impl ActorAndObjectRef for ActorAndObjectOptOriginAndTarget { - fn actor_field_ref(&self) -> &OneOrMany { - &self.actor - } - - fn object_field_ref(&self) -> &OneOrMany { - &self.object - } - - fn actor_field_mut(&mut self) -> &mut OneOrMany { - &mut self.actor - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - &mut self.object - } -} - -impl OptTargetRef for ActorAndObjectOptOriginAndTarget { - fn target_field_ref(&self) -> &Option> { - &self.target - } - - fn target_field_mut(&mut self) -> &mut Option> { - &mut self.target - } -} - -impl OptOriginRef for ActorAndObjectOptOriginAndTarget { - fn origin_field_ref(&self) -> &Option> { - &self.origin - } - - fn origin_field_mut(&mut self) -> &mut Option> { - &mut self.origin - } -} - -impl AsBase for Arrive { - fn base_ref(&self) -> &Base { - self.inner.base_ref() - } - - fn base_mut(&mut self) -> &mut Base { - self.inner.base_mut() - } -} - -impl AsObject for Arrive { - fn object_ref(&self) -> &Object { - self.inner.object_ref() - } - - fn object_mut(&mut self) -> &mut Object { - self.inner.object_mut() - } -} - -impl AsActivity for Arrive { - fn activity_ref(&self) -> &Activity { - &self.inner - } - - fn activity_mut(&mut self) -> &mut Activity { - &mut self.inner - } -} - -impl OriginRef for Arrive { - fn origin_field_ref(&self) -> &OneOrMany { - &self.origin - } - - fn origin_field_mut(&mut self) -> &mut OneOrMany { - &mut self.origin - } -} - -impl AsBase for Invite { - fn base_ref(&self) -> &Base { - self.inner.base_ref() - } - - fn base_mut(&mut self) -> &mut Base { - self.inner.base_mut() - } -} - -impl AsObject for Invite { - fn object_ref(&self) -> &Object { - self.inner.object_ref() - } - - fn object_mut(&mut self) -> &mut Object { - self.inner.object_mut() - } -} - -impl AsActivity for Invite { - fn activity_ref(&self) -> &Activity { - &self.inner - } - - fn activity_mut(&mut self) -> &mut Activity { - &mut self.inner - } -} - -impl ActorAndObjectRef for Invite { - fn actor_field_ref(&self) -> &OneOrMany { - &self.actor - } - - fn object_field_ref(&self) -> &OneOrMany { - &self.object - } - - fn actor_field_mut(&mut self) -> &mut OneOrMany { - &mut self.actor - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - &mut self.object - } -} - -impl TargetRef for Invite { - fn target_field_ref(&self) -> &OneOrMany { - &self.target - } - - fn target_field_mut(&mut self) -> &mut OneOrMany { - &mut self.target - } -} - -impl AsBase for Delete { - fn base_ref(&self) -> &Base { - self.inner.base_ref() - } - - fn base_mut(&mut self) -> &mut Base { - self.inner.base_mut() - } -} - -impl AsObject for Delete { - fn object_ref(&self) -> &Object { - self.inner.object_ref() - } - - fn object_mut(&mut self) -> &mut Object { - self.inner.object_mut() - } -} - -impl AsActivity for Delete { - fn activity_ref(&self) -> &Activity { - &self.inner - } - - fn activity_mut(&mut self) -> &mut Activity { - &mut self.inner - } -} - -impl ActorAndObjectRef for Delete { - fn actor_field_ref(&self) -> &OneOrMany { - &self.actor - } - - fn object_field_ref(&self) -> &OneOrMany { - &self.object - } - - fn actor_field_mut(&mut self) -> &mut OneOrMany { - &mut self.actor - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - &mut self.object - } -} - -impl OptOriginRef for Delete { - fn origin_field_ref(&self) -> &Option> { - &self.origin - } - - fn origin_field_mut(&mut self) -> &mut Option> { - &mut self.origin - } -} - -impl AsBase for Travel { - fn base_ref(&self) -> &Base { - self.inner.base_ref() - } - - fn base_mut(&mut self) -> &mut Base { - self.inner.base_mut() - } -} - -impl AsObject for Travel { - fn object_ref(&self) -> &Object { - self.inner.object_ref() - } - - fn object_mut(&mut self) -> &mut Object { - self.inner.object_mut() - } -} - -impl AsActivity for Travel { - fn activity_ref(&self) -> &Activity { + fn activity_ref(&self) -> &Activity { self.inner.activity_ref() } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self.inner.activity_mut() } } -impl OptTargetRef for Travel { - fn target_field_ref(&self) -> &Option> { - &self.target +impl AsActivityActor for ActivityActor +where + Inner: markers::Activity, +{ + type Inner = Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self } - fn target_field_mut(&mut self) -> &mut Option> { - &mut self.target + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self } } -impl OptOriginRef for Travel { - fn origin_field_ref(&self) -> &Option> { - &self.origin +impl AsActivityObject for ActivityActor +where + Inner: AsActivityObject, +{ + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() } - fn origin_field_mut(&mut self) -> &mut Option> { - &mut self.origin + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() } } -impl AsBase for Question { - fn base_ref(&self) -> &Base { +impl AsTarget for ActivityActor +where + Inner: AsTarget, +{ + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() + } + + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() + } +} + +impl AsOptTarget for ActivityActor +where + Inner: AsOptTarget, +{ + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() + } + + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOrigin for ActivityActor +where + Inner: AsOrigin, +{ + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() + } + + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() + } +} + +impl AsOptOrigin for ActivityActor +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() + } +} + +impl AsBase for ActivityObject +where + Inner: AsBase, +{ + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Question { - fn object_ref(&self) -> &Object { +impl AsObject for ActivityObject +where + Inner: AsObject, +{ + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } -impl AsActivity for Question { +impl AsActivity for ActivityObject +where + Inner: AsActivity, +{ + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { + self.inner.activity_ref() + } + + fn activity_mut(&mut self) -> &mut Activity { + self.inner.activity_mut() + } +} + +impl AsActivityObject for ActivityObject +where + Inner: markers::Activity, +{ + type Inner = Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self + } + + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self + } +} + +impl AsActivityActor for ActivityObject +where + Inner: AsActivityActor, +{ + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() + } + + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() + } +} + +impl AsTarget for ActivityObject +where + Inner: AsTarget, +{ + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() + } + + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() + } +} + +impl AsOptTarget for ActivityObject +where + Inner: AsOptTarget, +{ + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() + } + + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOrigin for ActivityObject +where + Inner: AsOrigin, +{ + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() + } + + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() + } +} + +impl AsOptOrigin for ActivityObject +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() + } +} + +impl AsBase for Target +where + Inner: AsBase, +{ + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { + self.inner.base_ref() + } + + fn base_mut(&mut self) -> &mut Base { + self.inner.base_mut() + } +} + +impl AsObject for Target +where + Inner: AsObject, +{ + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { + self.inner.object_ref() + } + + fn object_mut(&mut self) -> &mut Object { + self.inner.object_mut() + } +} + +impl AsActivity for Target +where + Inner: AsActivity, +{ + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { + self.inner.activity_ref() + } + + fn activity_mut(&mut self) -> &mut Activity { + self.inner.activity_mut() + } +} + +impl AsActivityObject for Target +where + Inner: AsActivityObject, +{ + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() + } + + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() + } +} + +impl AsActivityActor for Target +where + Inner: AsActivityActor, +{ + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() + } + + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() + } +} + +impl AsTarget for Target +where + Inner: markers::Activity, +{ + type Inner = Inner; + + fn target_ref(&self) -> &Target { + self + } + + fn target_mut(&mut self) -> &mut Target { + self + } +} + +impl AsOrigin for Target +where + Inner: AsOrigin, +{ + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() + } + + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() + } +} + +impl AsOptOrigin for Target +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() + } +} + +impl AsBase for OptTarget +where + Inner: AsBase, +{ + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { + self.inner.base_ref() + } + + fn base_mut(&mut self) -> &mut Base { + self.inner.base_mut() + } +} + +impl AsObject for OptTarget +where + Inner: AsObject, +{ + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { + self.inner.object_ref() + } + + fn object_mut(&mut self) -> &mut Object { + self.inner.object_mut() + } +} + +impl AsActivity for OptTarget +where + Inner: AsActivity, +{ + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { + self.inner.activity_ref() + } + + fn activity_mut(&mut self) -> &mut Activity { + self.inner.activity_mut() + } +} + +impl AsActivityObject for OptTarget +where + Inner: AsActivityObject, +{ + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() + } + + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() + } +} + +impl AsActivityActor for OptTarget +where + Inner: AsActivityActor, +{ + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() + } + + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() + } +} + +impl AsOptTarget for OptTarget +where + Inner: markers::Activity, +{ + type Inner = Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self + } + + fn opt_target_mut(&mut self) -> &mut OptTarget { + self + } +} + +impl AsOrigin for OptTarget +where + Inner: AsOrigin, +{ + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner.origin_ref() + } + + fn origin_mut(&mut self) -> &mut Origin { + self.inner.origin_mut() + } +} + +impl AsOptOrigin for OptTarget +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner.opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner.opt_origin_mut() + } +} + +impl AsActivity for Origin +where + Inner: AsActivity, +{ + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { + self.inner.activity_ref() + } + + fn activity_mut(&mut self) -> &mut Activity { + self.inner.activity_mut() + } +} + +impl AsBase for Origin +where + Inner: AsBase, +{ + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { + self.inner.base_ref() + } + + fn base_mut(&mut self) -> &mut Base { + self.inner.base_mut() + } +} + +impl AsObject for Origin +where + Inner: AsObject, +{ + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { + self.inner.object_ref() + } + + fn object_mut(&mut self) -> &mut Object { + self.inner.object_mut() + } +} + +impl AsActivityObject for Origin +where + Inner: AsActivityObject, +{ + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() + } + + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() + } +} + +impl AsActivityActor for Origin +where + Inner: AsActivityActor, +{ + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() + } + + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() + } +} + +impl AsTarget for Origin +where + Inner: AsTarget, +{ + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() + } + + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() + } +} + +impl AsOptTarget for Origin +where + Inner: AsOptTarget, +{ + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() + } + + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOrigin for Origin +where + Inner: markers::Activity, +{ + type Inner = Inner; + + fn origin_ref(&self) -> &Origin { + self + } + + fn origin_mut(&mut self) -> &mut Origin { + self + } +} + +impl AsBase for OptOrigin +where + Inner: AsBase, +{ + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { + self.inner.base_ref() + } + + fn base_mut(&mut self) -> &mut Base { + self.inner.base_mut() + } +} + +impl AsObject for OptOrigin +where + Inner: AsObject, +{ + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { + self.inner.object_ref() + } + + fn object_mut(&mut self) -> &mut Object { + self.inner.object_mut() + } +} + +impl AsActivity for OptOrigin +where + Inner: AsActivity, +{ + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { + self.inner.activity_ref() + } + + fn activity_mut(&mut self) -> &mut Activity { + self.inner.activity_mut() + } +} + +impl AsActivityObject for OptOrigin +where + Inner: AsActivityObject, +{ + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner.activity_object_ref() + } + + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner.activity_object_mut() + } +} + +impl AsActivityActor for OptOrigin +where + Inner: AsActivityActor, +{ + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner.activity_actor_ref() + } + + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner.activity_actor_mut() + } +} + +impl AsTarget for OptOrigin +where + Inner: AsTarget, +{ + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner.target_ref() + } + + fn target_mut(&mut self) -> &mut Target { + self.inner.target_mut() + } +} + +impl AsOptTarget for OptOrigin +where + Inner: AsOptTarget, +{ + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner.opt_target_ref() + } + + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner.opt_target_mut() + } +} + +impl AsOptOrigin for OptOrigin +where + Inner: markers::Activity, +{ + type Inner = Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self + } +} + +impl AsActivity for Question { + type Kind = QuestionType; + fn activity_ref(&self) -> &Activity { &self.inner } @@ -3681,89 +3966,108 @@ impl AsQuestion for Question { } } -impl AsActivity for ApObject +impl AsActivity for ApObject where - Inner: AsActivity, + Inner: AsActivity, { - fn activity_ref(&self) -> &Activity { + type Kind = Inner::Kind; + + fn activity_ref(&self) -> &Activity { self.inner().activity_ref() } - fn activity_mut(&mut self) -> &mut Activity { + fn activity_mut(&mut self) -> &mut Activity { self.inner_mut().activity_mut() } } -impl ActorAndObjectRef for ApObject +impl AsActivityActor for ApObject where - Inner: ActorAndObjectRef, + Inner: AsActivityActor, { - fn actor_field_ref(&self) -> &OneOrMany { - self.inner().actor_field_ref() + type Inner = Inner::Inner; + + fn activity_actor_ref(&self) -> &ActivityActor { + self.inner().activity_actor_ref() } - fn object_field_ref(&self) -> &OneOrMany { - self.inner().object_field_ref() - } - - fn actor_field_mut(&mut self) -> &mut OneOrMany { - self.inner_mut().actor_field_mut() - } - - fn object_field_mut(&mut self) -> &mut OneOrMany { - self.inner_mut().object_field_mut() + fn activity_actor_mut(&mut self) -> &mut ActivityActor { + self.inner_mut().activity_actor_mut() } } -impl TargetRef for ApObject +impl AsActivityObject for ApObject where - Inner: TargetRef, + Inner: AsActivityObject, { - fn target_field_ref(&self) -> &OneOrMany { - self.inner().target_field_ref() + type Inner = Inner::Inner; + + fn activity_object_ref(&self) -> &ActivityObject { + self.inner().activity_object_ref() } - fn target_field_mut(&mut self) -> &mut OneOrMany { - self.inner_mut().target_field_mut() + fn activity_object_mut(&mut self) -> &mut ActivityObject { + self.inner_mut().activity_object_mut() } } -impl OriginRef for ApObject +impl AsTarget for ApObject where - Inner: OriginRef, + Inner: AsTarget, { - fn origin_field_ref(&self) -> &OneOrMany { - self.inner().origin_field_ref() + type Inner = Inner::Inner; + + fn target_ref(&self) -> &Target { + self.inner().target_ref() } - fn origin_field_mut(&mut self) -> &mut OneOrMany { - self.inner_mut().origin_field_mut() + fn target_mut(&mut self) -> &mut Target { + self.inner_mut().target_mut() } } -impl OptTargetRef for ApObject +impl AsOrigin for ApObject where - Inner: OptTargetRef, + Inner: AsOrigin, { - fn target_field_ref(&self) -> &Option> { - self.inner().target_field_ref() + type Inner = Inner::Inner; + + fn origin_ref(&self) -> &Origin { + self.inner().origin_ref() } - fn target_field_mut(&mut self) -> &mut Option> { - self.inner_mut().target_field_mut() + fn origin_mut(&mut self) -> &mut Origin { + self.inner_mut().origin_mut() } } -impl OptOriginRef for ApObject +impl AsOptTarget for ApObject where - Inner: OptOriginRef, + Inner: AsOptTarget, { - fn origin_field_ref(&self) -> &Option> { - self.inner().origin_field_ref() + type Inner = Inner::Inner; + + fn opt_target_ref(&self) -> &OptTarget { + self.inner().opt_target_ref() } - fn origin_field_mut(&mut self) -> &mut Option> { - self.inner_mut().origin_field_mut() + fn opt_target_mut(&mut self) -> &mut OptTarget { + self.inner_mut().opt_target_mut() + } +} + +impl AsOptOrigin for ApObject +where + Inner: AsOptOrigin, +{ + type Inner = Inner::Inner; + + fn opt_origin_ref(&self) -> &OptOrigin { + self.inner().opt_origin_ref() + } + + fn opt_origin_mut(&mut self) -> &mut OptOrigin { + self.inner_mut().opt_origin_mut() } } @@ -3780,12 +4084,13 @@ where } } -impl ActivityExt for T where T: AsActivity {} -impl ActorAndObjectRefExt for T where T: ActorAndObjectRef {} -impl TargetRefExt for T where T: TargetRef {} -impl OriginRefExt for T where T: OriginRef {} -impl OptTargetRefExt for T where T: OptTargetRef {} -impl OptOriginRefExt for T where T: OptOriginRef {} +impl ActivityExt for T where T: AsActivity {} +impl AsActivityActorExt for T where T: AsActivityActor {} +impl AsActivityObjectExt for T where T: AsActivityObject {} +impl AsTargetExt for T where T: AsTarget {} +impl AsOriginExt for T where T: AsOrigin {} +impl AsOptTargetExt for T where T: AsOptTarget {} +impl AsOptOriginExt for T where T: AsOptOrigin {} impl QuestionExt for T where T: AsQuestion {} impl Default for Activity diff --git a/src/actor.rs b/src/actor.rs index 8142c4b..3ab5382 100644 --- a/src/actor.rs +++ b/src/actor.rs @@ -62,10 +62,10 @@ pub trait ApActorExt: AsApActor { /// /// let inbox_ref = person.inbox(); /// ``` - fn inbox<'a, Kind>(&'a self) -> Result<&'a IriString, CheckError> + fn inbox<'a>(&'a self) -> Result<&'a IriString, CheckError> where Inner: 'a, - Self: BaseExt, + Self: BaseExt, { let inbox = self.inbox_unchecked(); self.check_authority(inbox) @@ -129,10 +129,10 @@ pub trait ApActorExt: AsApActor { /// /// let outbox_ref = person.outbox(); /// ``` - fn outbox<'a, Kind>(&'a self) -> Result, CheckError> + fn outbox<'a>(&'a self) -> Result, CheckError> where Inner: 'a, - Self: BaseExt, + Self: BaseExt, { self.outbox_unchecked() .map(|outbox| self.check_authority(outbox)) @@ -236,10 +236,10 @@ pub trait ApActorExt: AsApActor { /// println!("{:?}", following); /// } /// ``` - fn following<'a, Kind>(&'a self) -> Result, CheckError> + fn following<'a>(&'a self) -> Result, CheckError> where Inner: 'a, - Self: BaseExt, + Self: BaseExt, { self.following_unchecked() .map(|following| self.check_authority(following)) @@ -345,10 +345,10 @@ pub trait ApActorExt: AsApActor { /// println!("{:?}", followers); /// } /// ``` - fn followers<'a, Kind>(&'a self) -> Result, CheckError> + fn followers<'a>(&'a self) -> Result, CheckError> where Inner: 'a, - Self: BaseExt, + Self: BaseExt, { self.followers_unchecked() .map(|followers| self.check_authority(followers)) @@ -454,10 +454,10 @@ pub trait ApActorExt: AsApActor { /// println!("{:?}", liked); /// } /// ``` - fn liked<'a, Kind>(&'a self) -> Result, CheckError> + fn liked<'a>(&'a self) -> Result, CheckError> where Inner: 'a, - Self: BaseExt, + Self: BaseExt, { self.liked_unchecked() .map(|liked| self.check_authority(liked)) @@ -563,10 +563,10 @@ pub trait ApActorExt: AsApActor { /// println!("{:?}", streams); /// } /// ``` - fn streams<'a, Kind>(&'a self) -> Result>, CheckError> + fn streams<'a>(&'a self) -> Result>, CheckError> where Inner: 'a, - Self: BaseExt, + Self: BaseExt, { if let Some(streams) = self.streams_unchecked() { for id in &streams { @@ -810,11 +810,10 @@ pub trait ApActorExt: AsApActor { /// # Ok(()) /// # } /// ``` - fn endpoints<'a, Kind>(&'a self) -> Result>, CheckError> + fn endpoints<'a>(&'a self) -> Result>, CheckError> where - Self: BaseExt, + Self: BaseExt, Inner: 'a, - Kind: 'a, { if let Some(endpoints) = self.endpoints_unchecked() { let authority_opt = self.id_unchecked().and_then(|id| id.authority_components()); @@ -1416,19 +1415,20 @@ impl markers::Actor for ApActor where Inner: markers::Actor {} impl markers::Actor for ApObject where Inner: markers::Actor {} -impl Extends for ApActor +impl Extends for ApActor where - Inner: Extends + UnparsedMut + markers::Actor, + Inner: Extends + UnparsedMut + markers::Actor, Error: From + std::error::Error, { + type Kind = Inner::Kind; type Error = Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let inner = Inner::extends(base)?; Ok(Self::extending(inner)?) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } @@ -1443,28 +1443,32 @@ where } } -impl AsBase for ApActor +impl AsBase for ApActor where - Inner: AsBase, + Inner: AsBase, { - fn base_ref(&self) -> &Base { + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for ApActor +impl AsObject for ApActor where - Inner: AsObject, + Inner: AsObject, { - fn object_ref(&self) -> &Object { + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } @@ -1495,14 +1499,16 @@ where } } -impl Extends for Actor { +impl Extends for Actor { + type Kind = Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { Object::extends(base).map(Actor) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { self.0.retracts() } } @@ -1513,22 +1519,26 @@ impl UnparsedMut for Actor { } } -impl AsBase for Actor { - fn base_ref(&self) -> &Base { +impl AsBase for Actor { + type Kind = Kind; + + fn base_ref(&self) -> &Base { self.0.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.0.base_mut() } } -impl AsObject for Actor { - fn object_ref(&self) -> &Object { +impl AsObject for Actor { + type Kind = Kind; + + fn object_ref(&self) -> &Object { self.0.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.0.object_mut() } } diff --git a/src/base.rs b/src/base.rs index fdd46e4..1e1008f 100644 --- a/src/base.rs +++ b/src/base.rs @@ -38,22 +38,24 @@ use mime::Mime; /// Implements conversion between `Base` and other ActivityStreams objects defined in this /// crate -pub trait Extends: Sized { +pub trait Extends: Sized { + type Kind; + /// The erro produced must be a StdError type Error: std::error::Error; /// Produce an object from the Base - fn extends(base: Base) -> Result; + fn extends(base: Base) -> Result; /// Produce a base from the object - fn retracts(self) -> Result, Self::Error>; + fn retracts(self) -> Result, Self::Error>; } /// A helper function implemented for all Extends types to easily produce an AnyBase from a given /// object. /// /// This is important because many APIs in this crate deal with AnyBases. -pub trait ExtendsExt: Extends { +pub trait ExtendsExt: Extends { /// Create an AnyBase from the given object /// /// ```rust @@ -68,7 +70,7 @@ pub trait ExtendsExt: Extends { /// ``` fn into_any_base(self) -> Result where - Kind: serde::ser::Serialize, + Self::Kind: serde::ser::Serialize, Self::Error: From, { AnyBase::from_extended(self) @@ -91,7 +93,7 @@ pub trait ExtendsExt: Extends { /// ``` fn from_any_base(any_base: AnyBase) -> Result, Self::Error> where - Kind: serde::de::DeserializeOwned, + Self::Kind: serde::de::DeserializeOwned, Self::Error: From, { if let Some(base) = any_base.take_base() { @@ -108,12 +110,14 @@ pub trait ExtendsExt: Extends { /// Implementation trait for deriving Base methods for a type /// /// Any type implementating AsBase will automatically gain methods provided by BaseExt -pub trait AsBase: markers::Base { +pub trait AsBase: markers::Base { + type Kind; + /// Immutable borrow of `Base` - fn base_ref(&self) -> &Base; + fn base_ref(&self) -> &Base; /// Mutable borrow of Base - fn base_mut(&mut self) -> &mut Base; + fn base_mut(&mut self) -> &mut Base; } /// Helper methods for interacting with Base types @@ -122,7 +126,7 @@ pub trait AsBase: markers::Base { /// Link or an Object. /// /// Documentation for the fields related to these methods can be found on the `Base` struct -pub trait BaseExt: AsBase { +pub trait BaseExt: AsBase { /// Fetch the context for the current object /// /// ```rust @@ -135,7 +139,7 @@ pub trait BaseExt: AsBase { /// ``` fn context<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.base_ref().context.as_ref() } @@ -277,7 +281,7 @@ pub trait BaseExt: AsBase { /// ``` fn id<'a>(&'a self, host: &str, port: Option<&str>) -> Result, CheckError> where - Kind: 'a, + Self::Kind: 'a, { self.id_unchecked() .and_then(|id| { @@ -306,7 +310,7 @@ pub trait BaseExt: AsBase { /// ``` fn id_unchecked<'a>(&'a self) -> Option<&'a IriString> where - Kind: 'a, + Self::Kind: 'a, { self.base_ref().id.as_ref() } @@ -329,7 +333,7 @@ pub trait BaseExt: AsBase { port: Option<&str>, ) -> Result, CheckError> where - Kind: 'a, + Self::Kind: 'a, { self.id_mut_unchecked() .and_then(|id| { @@ -358,7 +362,7 @@ pub trait BaseExt: AsBase { /// ``` fn id_mut_unchecked<'a>(&'a mut self) -> Option<&'a mut IriString> where - Kind: 'a, + Self::Kind: 'a, { self.base_mut().id.as_mut() } @@ -445,9 +449,9 @@ pub trait BaseExt: AsBase { /// println!("{:?}", kind); /// } /// ``` - fn kind<'a>(&'a self) -> Option<&'a Kind> + fn kind<'a>(&'a self) -> Option<&'a Self::Kind> where - Kind: 'a, + Self::Kind: 'a, { self.base_ref().kind.as_ref() } @@ -470,9 +474,9 @@ pub trait BaseExt: AsBase { /// # Ok(()) /// # } /// ``` - fn is_kind(&self, kind: &Kind) -> bool + fn is_kind(&self, kind: &Self::Kind) -> bool where - Kind: PartialEq, + Self::Kind: PartialEq, { self.kind() == Some(kind) } @@ -488,7 +492,7 @@ pub trait BaseExt: AsBase { /// /// video.set_kind(VideoType::Video); /// ``` - fn set_kind(&mut self, kind: Kind) -> &mut Self { + fn set_kind(&mut self, kind: Self::Kind) -> &mut Self { self.base_mut().kind = Some(kind); self } @@ -505,7 +509,7 @@ pub trait BaseExt: AsBase { /// println!("{:?}", kind); /// } /// ``` - fn take_kind(&mut self) -> Option { + fn take_kind(&mut self) -> Option { self.base_mut().kind.take() } @@ -541,7 +545,7 @@ pub trait BaseExt: AsBase { /// ``` fn name<'a>(&'a self) -> Option> where - Kind: 'a, + Self::Kind: 'a, { self.base_ref().name.as_ref().map(|o| o.as_ref()) } @@ -662,7 +666,7 @@ pub trait BaseExt: AsBase { /// ``` fn media_type<'a>(&'a self) -> Option<&'a Mime> where - Kind: 'a, + Self::Kind: 'a, { self.base_ref().media_type.as_ref().map(|m| m.as_ref()) } @@ -737,7 +741,7 @@ pub trait BaseExt: AsBase { /// ``` fn preview<'a>(&'a self) -> Option> where - Kind: 'a, + Self::Kind: 'a, { self.base_ref().preview.as_ref().map(|o| o.as_ref()) } @@ -1047,7 +1051,7 @@ impl Base { /// ``` pub fn extend(self) -> Result where - T: Extends, + T: Extends, { T::extends(self) } @@ -1066,7 +1070,7 @@ impl Base { /// ``` pub fn retract(t: T) -> Result where - T: Extends, + T: Extends, { t.retracts() } @@ -1170,7 +1174,7 @@ impl AnyBase { Ok(base.into()) } - /// Extend this AnyBase into a kind T where T implements Extends + /// Extend this AnyBase into a kind T where T implements Extends /// /// This method returns Ok(None) when the AnyBase does not contain an extensible object, i.e. /// it's just an IRI @@ -1186,8 +1190,8 @@ impl AnyBase { /// ``` pub fn extend(self) -> Result, T::Error> where - T: ExtendsExt, - >::Error: From, + T: ExtendsExt, + ::Error: From, for<'de> Kind: serde::Deserialize<'de>, { T::from_any_base(self) @@ -1205,7 +1209,7 @@ impl AnyBase { /// ``` pub fn from_extended(extended: T) -> Result where - T: Extends, + T: Extends, T::Error: From, Kind: serde::ser::Serialize, { @@ -1936,35 +1940,38 @@ impl UnparsedMut for Base { } } -impl AsBase for Base { - fn base_ref(&self) -> &Base { +impl AsBase for Base { + type Kind = Kind; + + fn base_ref(&self) -> &Base { self } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self } } -impl Extends for Base { +impl Extends for Base { + type Kind = Kind; type Error = std::convert::Infallible; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { Ok(base) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { Ok(self) } } -impl ExtendsExt for T +impl ExtendsExt for T where - T: Extends, + T: Extends, T::Error: From, { } -impl BaseExt for T where T: AsBase {} +impl BaseExt for T where T: AsBase {} impl From> for AnyBase { fn from(o: Base) -> Self { diff --git a/src/collection.rs b/src/collection.rs index 92e8201..f3890ad 100644 --- a/src/collection.rs +++ b/src/collection.rs @@ -38,17 +38,21 @@ use self::kind::*; /// Implementation trait for deriving Collection methods for a type /// /// Any type implementing AsCollection will automatically gain methods provided by CollectionExt -pub trait AsCollection: markers::Collection { - fn collection_ref(&self) -> &Collection; - fn collection_mut(&mut self) -> &mut Collection; +pub trait AsCollection: markers::Collection { + type Kind; + + fn collection_ref(&self) -> &Collection; + fn collection_mut(&mut self) -> &mut Collection; } /// Implementation trait for deriving Collection methods for a type /// /// Any type implementing AsCollectionPage will automatically gain methods provided by CollectionPageExt -pub trait AsCollectionPage: markers::CollectionPage { - fn collection_page_ref(&self) -> &CollectionPage; - fn collection_page_mut(&mut self) -> &mut CollectionPage; +pub trait AsCollectionPage: markers::CollectionPage { + type Kind; + + fn collection_page_ref(&self) -> &CollectionPage; + fn collection_page_mut(&mut self) -> &mut CollectionPage; } /// Implementation trait for deriving Collection methods for a type @@ -66,7 +70,7 @@ pub trait AsOrderedCollectionPage: markers::CollectionPage { /// /// Documentation for the fields related to these methods can be found on the /// `Collection` struct -pub trait CollectionExt: AsCollection { +pub trait CollectionExt: AsCollection { /// Fetch the items for the current activity /// /// ```rust @@ -80,7 +84,7 @@ pub trait CollectionExt: AsCollection { /// ``` fn items<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.collection_ref().items.as_ref() } @@ -209,7 +213,7 @@ pub trait CollectionExt: AsCollection { /// ``` fn ordered_items<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.collection_ref().ordered_items.as_ref() } @@ -338,7 +342,7 @@ pub trait CollectionExt: AsCollection { /// ``` fn total_items<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.collection_ref().total_items } @@ -408,7 +412,7 @@ pub trait CollectionExt: AsCollection { /// ``` fn current<'a>(&'a self) -> Option<&'a AnyBase> where - Kind: 'a, + Self::Kind: 'a, { self.collection_ref().current.as_ref() } @@ -484,7 +488,7 @@ pub trait CollectionExt: AsCollection { /// ``` fn first<'a>(&'a self) -> Option<&'a AnyBase> where - Kind: 'a, + Self::Kind: 'a, { self.collection_ref().first.as_ref() } @@ -560,7 +564,7 @@ pub trait CollectionExt: AsCollection { /// ``` fn last<'a>(&'a self) -> Option<&'a AnyBase> where - Kind: 'a, + Self::Kind: 'a, { self.collection_ref().last.as_ref() } @@ -629,7 +633,7 @@ pub trait CollectionExt: AsCollection { /// /// Documentation for the fields related to these methods can be found on the /// `CollectionPage` struct -pub trait CollectionPageExt: AsCollectionPage { +pub trait CollectionPageExt: AsCollectionPage { /// Fetch the part_of field for the current object /// /// ```rust @@ -644,7 +648,7 @@ pub trait CollectionPageExt: AsCollectionPage { /// ``` fn part_of<'a>(&'a self) -> Option<&'a AnyBase> where - Kind: 'a, + Self::Kind: 'a, { self.collection_page_ref().part_of.as_ref() } @@ -720,7 +724,7 @@ pub trait CollectionPageExt: AsCollectionPage { /// ``` fn next<'a>(&'a self) -> Option<&'a AnyBase> where - Kind: 'a, + Self::Kind: 'a, { self.collection_page_ref().next.as_ref() } @@ -796,7 +800,7 @@ pub trait CollectionPageExt: AsCollectionPage { /// ``` fn prev<'a>(&'a self) -> Option<&'a AnyBase> where - Kind: 'a, + Self::Kind: 'a, { self.collection_page_ref().prev.as_ref() } @@ -1281,15 +1285,17 @@ impl markers::CollectionPage for OrderedCollectionPage {} impl markers::Collection for ApObject where Inner: markers::Collection {} impl markers::CollectionPage for ApObject where Inner: markers::CollectionPage {} -impl Extends for Collection { +impl Extends for Collection { + type Kind = Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let inner = Object::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } @@ -1311,15 +1317,17 @@ impl TryFrom> for Collection { } } -impl Extends for CollectionPage { +impl Extends for CollectionPage { + type Kind = Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let inner = Object::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } @@ -1341,7 +1349,9 @@ impl TryFrom> for Object { } } -impl Extends for OrderedCollectionPage { +impl Extends for OrderedCollectionPage { + type Kind = OrderedCollectionPageType; + type Error = serde_json::Error; fn extends(base: Base) -> Result { @@ -1389,77 +1399,93 @@ impl UnparsedMut for OrderedCollectionPage { } } -impl AsBase for Collection { - fn base_ref(&self) -> &Base { +impl AsBase for Collection { + type Kind = Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for Collection { - fn object_ref(&self) -> &Object { +impl AsObject for Collection { + type Kind = Kind; + + fn object_ref(&self) -> &Object { &self.inner } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { &mut self.inner } } -impl AsCollection for Collection { - fn collection_ref(&self) -> &Collection { +impl AsCollection for Collection { + type Kind = Kind; + + fn collection_ref(&self) -> &Collection { self } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { self } } -impl AsBase for CollectionPage { - fn base_ref(&self) -> &Base { +impl AsBase for CollectionPage { + type Kind = Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for CollectionPage { - fn object_ref(&self) -> &Object { +impl AsObject for CollectionPage { + type Kind = Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } -impl AsCollection for CollectionPage { - fn collection_ref(&self) -> &Collection { +impl AsCollection for CollectionPage { + type Kind = Kind; + + fn collection_ref(&self) -> &Collection { &self.inner } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { &mut self.inner } } -impl AsCollectionPage for CollectionPage { - fn collection_page_ref(&self) -> &CollectionPage { +impl AsCollectionPage for CollectionPage { + type Kind = Kind; + + fn collection_page_ref(&self) -> &CollectionPage { self } - fn collection_page_mut(&mut self) -> &mut CollectionPage { + fn collection_page_mut(&mut self) -> &mut CollectionPage { self } } -impl AsBase for OrderedCollectionPage { +impl AsBase for OrderedCollectionPage { + type Kind = OrderedCollectionPageType; + fn base_ref(&self) -> &Base { self.inner.base_ref() } @@ -1469,7 +1495,9 @@ impl AsBase for OrderedCollectionPage { } } -impl AsObject for OrderedCollectionPage { +impl AsObject for OrderedCollectionPage { + type Kind = OrderedCollectionPageType; + fn object_ref(&self) -> &Object { self.inner.object_ref() } @@ -1479,7 +1507,9 @@ impl AsObject for OrderedCollectionPage { } } -impl AsCollection for OrderedCollectionPage { +impl AsCollection for OrderedCollectionPage { + type Kind = OrderedCollectionPageType; + fn collection_ref(&self) -> &Collection { self.inner.collection_ref() } @@ -1489,7 +1519,9 @@ impl AsCollection for OrderedCollectionPage { } } -impl AsCollectionPage for OrderedCollectionPage { +impl AsCollectionPage for OrderedCollectionPage { + type Kind = OrderedCollectionPageType; + fn collection_page_ref(&self) -> &CollectionPage { &self.inner } @@ -1509,28 +1541,32 @@ impl AsOrderedCollectionPage for OrderedCollectionPage { } } -impl AsCollection for ApObject +impl AsCollection for ApObject where - Inner: AsCollection, + Inner: AsCollection, { - fn collection_ref(&self) -> &Collection { + type Kind = Inner::Kind; + + fn collection_ref(&self) -> &Collection { self.inner().collection_ref() } - fn collection_mut(&mut self) -> &mut Collection { + fn collection_mut(&mut self) -> &mut Collection { self.inner_mut().collection_mut() } } -impl AsCollectionPage for ApObject +impl AsCollectionPage for ApObject where - Inner: AsCollectionPage, + Inner: AsCollectionPage, { - fn collection_page_ref(&self) -> &CollectionPage { + type Kind = Inner::Kind; + + fn collection_page_ref(&self) -> &CollectionPage { self.inner().collection_page_ref() } - fn collection_page_mut(&mut self) -> &mut CollectionPage { + fn collection_page_mut(&mut self) -> &mut CollectionPage { self.inner_mut().collection_page_mut() } } @@ -1548,8 +1584,8 @@ where } } -impl CollectionExt for T where T: AsCollection {} -impl CollectionPageExt for T where T: AsCollectionPage {} +impl CollectionExt for T where T: AsCollection {} +impl CollectionPageExt for T where T: AsCollectionPage {} impl OrderedCollectionPageExt for T where T: AsOrderedCollectionPage {} impl Default for Collection diff --git a/src/lib.rs b/src/lib.rs index 501fd15..5ef57c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,10 @@ //! # ActivityStreams New //! _A set of Traits and Types that make up the ActivityStreams and ActivityPub specifications_ //! -//! - Find the code on [git.asonix.dog](https://git.asonix.dog/Aardwolf/activitystreams) +//! - Find the code on [git.asonix.dog](https://git.asonix.dog/asonix/activitystreams) //! - Read the docs on [docs.rs](https://docs.rs/activitystreams) -//! - Join the matrix channel at [#activitypub:asonix.dog](https://matrix.to/#/!fAEcHyTUdAaKCzIKCt:asonix.dog?via=asonix.dog&via=matrix.org&via=t2bot.io) -//! - Hit me up on [mastodon](https://asonix.dog/@asonix) +//! - Join the matrix channel at [#activitypub:matrix.asonix.dog](https://matrix.to/#/!fAEcHyTUdAaKCzIKCt:asonix.dog?via=asonix.dog&via=matrix.org&via=t2bot.io) +//! - Hit me up on [mastodon](https://masto.asonix.dog/@asonix) //! //! ## Usage //! @@ -166,9 +166,9 @@ //! ```rust //! use activitystreams::{base::BaseExt, context, markers::Activity, iri}; //! -//! fn manipulator(mut activity: T) -> Result<(), anyhow::Error> +//! fn manipulator(mut activity: T) -> Result<(), anyhow::Error> //! where -//! T: Activity + BaseExt, +//! T: Activity + BaseExt, //! { //! activity //! .set_id(iri!("https://example.com")) @@ -375,8 +375,8 @@ pub mod prelude { pub use crate::{ activity::{ - ActivityExt, ActorAndObjectRefExt, OptOriginRefExt, OptTargetRefExt, OriginRefExt, - QuestionExt, TargetRefExt, + ActivityExt, AsActivityActorExt, AsActivityObjectExt, AsOptOriginExt, AsOptTargetExt, + AsOriginExt, AsTargetExt, QuestionExt, }, actor::ApActorExt, base::{BaseExt, ExtendsExt}, diff --git a/src/link.rs b/src/link.rs index 4a0953a..3688936 100644 --- a/src/link.rs +++ b/src/link.rs @@ -36,12 +36,13 @@ use self::kind::MentionType; /// Implementation trait for deriving Link methods for a type /// /// Any type implementing AsLink will automatically gain methods provided by LinkExt -pub trait AsLink: markers::Link { +pub trait AsLink: markers::Link { + type Kind; /// Immutable borrow of `Link` - fn link_ref(&self) -> &Link; + fn link_ref(&self) -> &Link; /// Mutable borrow of `Link` - fn link_mut(&mut self) -> &mut Link; + fn link_mut(&mut self) -> &mut Link; } /// Helper methods for interacting with Link types @@ -49,7 +50,7 @@ pub trait AsLink: markers::Link { /// This trait represents methods valid for any ActivityStreams Link. /// /// Documentation for the fields related to these methods can be found on the `Link` struct -pub trait LinkExt: AsLink { +pub trait LinkExt: AsLink { /// Fetch the href for the current object /// /// ```rust @@ -62,7 +63,7 @@ pub trait LinkExt: AsLink { /// ``` fn href<'a>(&'a self) -> Option<&'a IriString> where - Kind: 'a, + Self::Kind: 'a, { self.link_ref().href.as_ref() } @@ -136,7 +137,7 @@ pub trait LinkExt: AsLink { /// ``` fn hreflang<'a>(&'a self) -> Option<&'a str> where - Kind: 'a, + Self::Kind: 'a, { self.link_ref().hreflang.as_deref() } @@ -210,7 +211,7 @@ pub trait LinkExt: AsLink { /// ``` fn rel<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.link_ref().rel.as_ref() } @@ -330,7 +331,7 @@ pub trait LinkExt: AsLink { /// ``` fn height<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.link_ref().height } @@ -403,7 +404,7 @@ pub trait LinkExt: AsLink { /// ``` fn width<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.link_ref().width } @@ -618,14 +619,16 @@ impl Link { impl markers::Base for Link {} impl markers::Link for Link {} -impl Extends for Link { +impl Extends for Link { + type Kind = Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { Self::extending(base) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { self.retracting() } } @@ -658,27 +661,31 @@ impl UnparsedMut for Link { } } -impl AsBase for Link { - fn base_ref(&self) -> &Base { +impl AsBase for Link { + type Kind = Kind; + + fn base_ref(&self) -> &Base { &self.inner } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { &mut self.inner } } -impl AsLink for Link { - fn link_ref(&self) -> &Link { +impl AsLink for Link { + type Kind = Kind; + + fn link_ref(&self) -> &Link { self } - fn link_mut(&mut self) -> &mut Link { + fn link_mut(&mut self) -> &mut Link { self } } -impl LinkExt for T where T: AsLink {} +impl LinkExt for T where T: AsLink {} impl Default for Link where diff --git a/src/markers.rs b/src/markers.rs index 72453f9..e27fd37 100644 --- a/src/markers.rs +++ b/src/markers.rs @@ -4,9 +4,9 @@ //! use activitystreams::{base::BaseExt, markers::Activity}; //! //! /// Applies the name "hi" to any given activity -//! fn manipulator(mut some_type: T) -> T +//! fn manipulator(mut some_type: T) -> T //! where -//! T: Activity + BaseExt, +//! T: Activity + BaseExt, //! { //! some_type.set_name("hi"); //! diff --git a/src/object.rs b/src/object.rs index 3883b5f..97cd53f 100644 --- a/src/object.rs +++ b/src/object.rs @@ -36,12 +36,14 @@ use self::kind::*; /// Implementation trait for deriving Object methods for a type /// /// Any type implementing AsObject will automatically gain methods provided by ObjectExt -pub trait AsObject: markers::Object { +pub trait AsObject: markers::Object { + type Kind; + /// Immutable borrow of `Object` - fn object_ref(&self) -> &Object; + fn object_ref(&self) -> &Object; /// Mutable borrow of `Object` - fn object_mut(&mut self) -> &mut Object; + fn object_mut(&mut self) -> &mut Object; } /// Implementation trait for deriving ActivityPub Object methods for a type @@ -105,7 +107,7 @@ pub trait AsTombstone: markers::Object { /// This trait represents methods valid for any ActivityStreams Object. /// /// Documentation for the fields related to these methods can be found on the `Object` struct -pub trait ObjectExt: AsObject { +pub trait ObjectExt: AsObject { /// Fetch the attachment for the current object /// /// ```rust @@ -120,7 +122,7 @@ pub trait ObjectExt: AsObject { /// ``` fn attachment<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().attachment.as_ref() } @@ -256,7 +258,7 @@ pub trait ObjectExt: AsObject { /// ``` fn attributed_to<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().attributed_to.as_ref() } @@ -392,7 +394,7 @@ pub trait ObjectExt: AsObject { /// ``` fn audience<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().audience.as_ref() } @@ -526,7 +528,7 @@ pub trait ObjectExt: AsObject { /// ``` fn content<'a>(&'a self) -> Option> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().content.as_ref().map(|o| o.as_ref()) } @@ -647,7 +649,7 @@ pub trait ObjectExt: AsObject { /// ``` fn summary<'a>(&'a self) -> Option> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().summary.as_ref().map(|o| o.as_ref()) } @@ -768,7 +770,7 @@ pub trait ObjectExt: AsObject { /// ``` fn url<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().url.as_ref() } @@ -904,7 +906,7 @@ pub trait ObjectExt: AsObject { /// ``` fn generator<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().generator.as_ref() } @@ -1040,7 +1042,7 @@ pub trait ObjectExt: AsObject { /// ``` fn icon<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().icon.as_ref() } @@ -1176,7 +1178,7 @@ pub trait ObjectExt: AsObject { /// ``` fn image<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().image.as_ref() } @@ -1312,7 +1314,7 @@ pub trait ObjectExt: AsObject { /// ``` fn location<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().location.as_ref() } @@ -1448,7 +1450,7 @@ pub trait ObjectExt: AsObject { /// ``` fn tag<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().tag.as_ref() } @@ -1584,7 +1586,7 @@ pub trait ObjectExt: AsObject { /// ``` fn start_time<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.object_ref() .start_time @@ -1662,7 +1664,7 @@ pub trait ObjectExt: AsObject { /// ``` fn end_time<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.object_ref() .end_time @@ -1740,7 +1742,7 @@ pub trait ObjectExt: AsObject { /// ``` fn duration<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.object_ref() .duration @@ -1820,7 +1822,7 @@ pub trait ObjectExt: AsObject { /// ``` fn published<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.object_ref() .published @@ -1898,7 +1900,7 @@ pub trait ObjectExt: AsObject { /// ``` fn updated<'a>(&'a self) -> Option where - Kind: 'a, + Self::Kind: 'a, { self.object_ref() .updated @@ -1976,7 +1978,7 @@ pub trait ObjectExt: AsObject { /// ``` fn in_reply_to<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().in_reply_to.as_ref() } @@ -2112,7 +2114,7 @@ pub trait ObjectExt: AsObject { /// ``` fn replies<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().replies.as_ref() } @@ -2248,7 +2250,7 @@ pub trait ObjectExt: AsObject { /// ``` fn to<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().to.as_ref() } @@ -2384,7 +2386,7 @@ pub trait ObjectExt: AsObject { /// ``` fn bto<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().bto.as_ref() } @@ -2520,7 +2522,7 @@ pub trait ObjectExt: AsObject { /// ``` fn cc<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().cc.as_ref() } @@ -2656,7 +2658,7 @@ pub trait ObjectExt: AsObject { /// ``` fn bcc<'a>(&'a self) -> Option<&'a OneOrMany> where - Kind: 'a, + Self::Kind: 'a, { self.object_ref().bcc.as_ref() } @@ -5131,14 +5133,16 @@ impl Tombstone { } } -impl Extends for Object { +impl Extends for Object { + type Kind = Kind; + type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { Self::extending(base) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { self.retracting() } } @@ -5159,24 +5163,26 @@ impl TryFrom> for Base { } } -impl Extends for ApObject +impl Extends for ApObject where - Inner: Extends + UnparsedMut + markers::Object, + Inner: Extends + UnparsedMut + markers::Object, { + type Kind = Inner::Kind; type Error = serde_json::Error; - fn extends(base: Base) -> Result { + fn extends(base: Base) -> Result { let inner = Inner::extends(base)?; Self::extending(inner) } - fn retracts(self) -> Result, Self::Error> { + fn retracts(self) -> Result, Self::Error> { let inner = self.retracting()?; inner.retracts() } } -impl Extends for Place { +impl Extends for Place { + type Kind = PlaceType; type Error = serde_json::Error; fn extends(base: Base) -> Result { @@ -5206,7 +5212,8 @@ impl TryFrom for Object { } } -impl Extends for Profile { +impl Extends for Profile { + type Kind = ProfileType; type Error = serde_json::Error; fn extends(base: Base) -> Result { @@ -5236,7 +5243,8 @@ impl TryFrom for Object { } } -impl Extends for Relationship { +impl Extends for Relationship { + type Kind = RelationshipType; type Error = serde_json::Error; fn extends(base: Base) -> Result { @@ -5266,7 +5274,9 @@ impl TryFrom for Object { } } -impl Extends for Tombstone { +impl Extends for Tombstone { + type Kind = TombstoneType; + type Error = serde_json::Error; fn extends(base: Base) -> Result { @@ -5353,55 +5363,63 @@ impl markers::Object for Relationship {} impl markers::Base for Tombstone {} impl markers::Object for Tombstone {} -impl ObjectExt for T where T: AsObject {} +impl ObjectExt for T where T: AsObject {} impl ApObjectExt for T where T: AsApObject {} impl PlaceExt for T where T: AsPlace {} impl ProfileExt for T where T: AsProfile {} impl RelationshipExt for T where T: AsRelationship {} impl TombstoneExt for T where T: AsTombstone {} -impl AsBase for Object { - fn base_ref(&self) -> &Base { +impl AsBase for Object { + type Kind = Kind; + + fn base_ref(&self) -> &Base { &self.inner } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { &mut self.inner } } -impl AsObject for Object { - fn object_ref(&self) -> &Object { +impl AsObject for Object { + type Kind = Kind; + + fn object_ref(&self) -> &Object { self } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self } } -impl AsBase for ApObject +impl AsBase for ApObject where - Inner: AsBase, + Inner: AsBase, { - fn base_ref(&self) -> &Base { + type Kind = Inner::Kind; + + fn base_ref(&self) -> &Base { self.inner.base_ref() } - fn base_mut(&mut self) -> &mut Base { + fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } -impl AsObject for ApObject +impl AsObject for ApObject where - Inner: AsObject, + Inner: AsObject, { - fn object_ref(&self) -> &Object { + type Kind = Inner::Kind; + + fn object_ref(&self) -> &Object { self.inner.object_ref() } - fn object_mut(&mut self) -> &mut Object { + fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } @@ -5471,7 +5489,9 @@ where } } -impl AsBase for Place { +impl AsBase for Place { + type Kind = PlaceType; + fn base_ref(&self) -> &Base { self.inner.base_ref() } @@ -5481,7 +5501,9 @@ impl AsBase for Place { } } -impl AsObject for Place { +impl AsObject for Place { + type Kind = PlaceType; + fn object_ref(&self) -> &Object { &self.inner } @@ -5501,7 +5523,9 @@ impl AsPlace for Place { } } -impl AsBase for Profile { +impl AsBase for Profile { + type Kind = ProfileType; + fn base_ref(&self) -> &Base { self.inner.base_ref() } @@ -5511,7 +5535,9 @@ impl AsBase for Profile { } } -impl AsObject for Profile { +impl AsObject for Profile { + type Kind = ProfileType; + fn object_ref(&self) -> &Object { &self.inner } @@ -5531,7 +5557,9 @@ impl AsProfile for Profile { } } -impl AsBase for Relationship { +impl AsBase for Relationship { + type Kind = RelationshipType; + fn base_ref(&self) -> &Base { self.inner.base_ref() } @@ -5541,7 +5569,9 @@ impl AsBase for Relationship { } } -impl AsObject for Relationship { +impl AsObject for Relationship { + type Kind = RelationshipType; + fn object_ref(&self) -> &Object { &self.inner } @@ -5561,7 +5591,9 @@ impl AsRelationship for Relationship { } } -impl AsBase for Tombstone { +impl AsBase for Tombstone { + type Kind = TombstoneType; + fn base_ref(&self) -> &Base { self.inner.base_ref() } @@ -5571,7 +5603,9 @@ impl AsBase for Tombstone { } } -impl AsObject for Tombstone { +impl AsObject for Tombstone { + type Kind = TombstoneType; + fn object_ref(&self) -> &Object { &self.inner } diff --git a/src/unparsed.rs b/src/unparsed.rs index b1c8e93..e2f74fe 100644 --- a/src/unparsed.rs +++ b/src/unparsed.rs @@ -46,13 +46,14 @@ //! //! /// Then, we'll implement Extends so we can produce a PublicKey from an AnyBase. //! -//! impl Extends for PublicKey +//! impl Extends for PublicKey //! where -//! Inner: Extends + UnparsedMut, +//! Inner: Extends + UnparsedMut, //! { +//! type Kind = Inner::Kind; //! type Error = serde_json::Error; //! -//! fn extends(base: Base) -> Result { +//! fn extends(base: Base) -> Result { //! let mut inner = Inner::extends(base)?; //! //! Ok(PublicKey { @@ -61,7 +62,7 @@ //! }) //! } //! -//! fn retracts(self) -> Result, Self::Error> { +//! fn retracts(self) -> Result, Self::Error> { //! let PublicKey { //! public_key, //! mut inner, @@ -87,15 +88,17 @@ //! /// //! /// This allows us to access methods related to `context`, `id`, `kind`, `name`, //! /// `media_type`, and `preview` directly from the PublicKey struct -//! impl AsBase for PublicKey +//! impl AsBase for PublicKey //! where -//! Inner: AsBase, +//! Inner: AsBase, //! { -//! fn base_ref(&self) -> &Base { +//! type Kind = Inner::Kind; +//! +//! fn base_ref(&self) -> &Base { //! self.inner.base_ref() //! } //! -//! fn base_mut(&mut self) -> &mut Base { +//! fn base_mut(&mut self) -> &mut Base { //! self.inner.base_mut() //! } //! } @@ -104,15 +107,17 @@ //! /// //! /// This allows us to access methods related to `url`, `generator`, `start_time`, `duration`, //! /// and more directly from the PublicKey struct -//! impl AsObject for PublicKey +//! impl AsObject for PublicKey //! where -//! Inner: AsObject, +//! Inner: AsObject, //! { -//! fn object_ref(&self) -> &Object { +//! type Kind = Inner::Kind; +//! +//! fn object_ref(&self) -> &Object { //! self.inner.object_ref() //! } //! -//! fn object_mut(&mut self) -> &mut Object { +//! fn object_mut(&mut self) -> &mut Object { //! self.inner.object_mut() //! } //! }