//! Types and traits for dealing with Activity attributes //! //! ```rust //! # fn main() -> Result<(), anyhow::Error> { //! use activitystreams::{ //! activity::Create, //! context, //! prelude::*, //! uri, //! }; //! //! let mut create = Create::new( //! uri!("https://example.com/actors/abcd"), //! uri!("https://example.com/notes/1234"), //! ); //! //! create //! .set_result(uri!("https://example.com/")) //! .set_instrument(uri!("https://example.com/")) //! .set_id(uri!("https://example.com/activities/abcd")) //! .set_context(context()); //! # Ok(()) //! # } //! ``` use crate::{ base::{AnyBase, AsBase, Base, BaseExt, Extends}, error::DomainError, markers, object::{ApObject, AsObject, Object}, primitives::OneOrMany, unparsed::{Unparsed, UnparsedMut, UnparsedMutExt}, }; use std::convert::TryFrom; use url::Url; pub mod kind { //! Kinds of activities defined by the spec //! //! These types exist only to be statically-typed versions of the associated string. e.g. //! `CreateType` -> `"Create"` use crate::kind; kind!(AcceptType, Accept); kind!(AddType, Add); kind!(AnnounceType, Announce); kind!(ArriveType, Arrive); kind!(BlockType, Block); kind!(CreateType, Create); kind!(DeleteType, Delete); kind!(DislikeType, Dislike); kind!(FlagType, Flag); kind!(FollowType, Follow); kind!(IgnoreType, Ignore); kind!(InviteType, Invite); kind!(JoinType, Join); kind!(LeaveType, Leave); kind!(LikeType, Like); kind!(ListenType, Listen); kind!(MoveType, Move); kind!(OfferType, Offer); kind!(QuestionType, Question); kind!(ReadType, Read); kind!(RejectType, Reject); kind!(RemoveType, Remove); kind!(TentativeAcceptType, TentativeAccept); kind!(TentativeRejectType, TentativeReject); kind!(TravelType, Travel); kind!(UndoType, Undo); kind!(UpdateType, Update); kind!(ViewType, View); } 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 { /// Immutable borrow of `Activity` fn activity_ref(&self) -> &Activity; /// Mutable borrow of `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; /// Mutable borrow of actor field fn object_field_ref(&self) -> &OneOrMany; /// Immutable borrow of object field fn actor_field_mut(&mut self) -> &mut OneOrMany; /// Mutable borrow of object field fn object_field_mut(&mut self) -> &mut OneOrMany; } /// 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; /// Mutable borrow of target field fn target_field_mut(&mut self) -> &mut OneOrMany; } /// 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; /// Mutable borrow of origin field fn origin_field_mut(&mut self) -> &mut OneOrMany; } /// 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>; /// Mutable borrow of target field fn target_field_mut(&mut self) -> &mut Option>; } /// 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>; /// Mutable borrow of origin field fn origin_field_mut(&mut self) -> &mut Option>; } /// Implementation trait for deriving Question methods for a type /// /// Any type implementing AsQuestion will automatically gain methods provided by /// `QuestionExt` pub trait AsQuestion: markers::Activity { /// Immutable borrow of Question fn question_ref(&self) -> &Question; /// Mutable borrow of Question fn question_mut(&mut self) -> &mut Question; } /// Helper methods for interacting with Activity types /// /// This trait represents methods valid for any ActivityStreams Activity /// /// Documentation for the fields related to these methods can be found on the `Activity` /// struct pub trait ActivityExt: AsActivity { /// Fetch the result for the current activity /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(result) = question.result() { /// println!("{:?}", result); /// } /// ``` fn result<'a>(&'a self) -> Option<&'a OneOrMany> where Kind: 'a, { self.activity_ref().result.as_ref() } /// Set the result for the current activity /// /// This overwrites the contents of result /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_result(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_result(&mut self, result: T) -> &mut Self where T: Into, { self.activity_mut().result = Some(result.into().into()); self } /// Set many results for the current activity /// /// This overwrites the contents of result /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_many_results(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_results(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); self.activity_mut().result = Some(v.into()); self } /// Add a result to the current activity /// /// This does not overwrite the contents of result, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::{prelude::*, uri}; /// # use activitystreams::{activity::Question}; /// # let mut question = Question::new(); /// /// question /// .add_result(uri!("https://example.com/one")) /// .add_result(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_result(&mut self, result: T) -> &mut Self where T: Into, { let c = match self.activity_mut().result.take() { Some(mut c) => { c.add(result.into()); c } None => vec![result.into()].into(), }; self.activity_mut().result = Some(c); self } /// Take the result from the current activity, leaving nothing /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(result) = question.take_result() { /// println!("{:?}", result); /// } /// ``` fn take_result(&mut self) -> Option> { self.activity_mut().result.take() } /// Delete the result from the current activity /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// # question.set_result(uri!("https://example.com")); /// # /// use activitystreams::prelude::*; /// /// assert!(question.result().is_some()); /// question.delete_result(); /// assert!(question.result().is_none()); /// # Ok(()) /// # } /// ``` fn delete_result(&mut self) -> &mut Self { self.activity_mut().result = None; self } /// Fetch the instrument for the current activity /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(instrument) = question.instrument() { /// println!("{:?}", instrument); /// } /// ``` fn instrument<'a>(&'a self) -> Option<&'a OneOrMany> where Kind: 'a, { self.activity_ref().instrument.as_ref() } /// Set the instrument for the current activity /// /// This overwrites the contents of instrument /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_instrument(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_instrument(&mut self, instrument: T) -> &mut Self where T: Into, { self.activity_mut().instrument = Some(instrument.into().into()); self } /// Set many instruments for the current activity /// /// This overwrites the contents of instrument /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_many_instruments(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_instruments(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); self.activity_mut().instrument = Some(v.into()); self } /// Add a instrument to the current activity /// /// This does not overwrite the contents of instrument, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question /// .add_instrument(uri!("https://example.com/one")) /// .add_instrument(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_instrument(&mut self, instrument: T) -> &mut Self where T: Into, { let c = match self.activity_mut().instrument.take() { Some(mut c) => { c.add(instrument.into()); c } None => vec![instrument.into()].into(), }; self.activity_mut().instrument = Some(c); self } /// Take the instrument from the current activity, leaving nothing /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(instrument) = question.take_instrument() { /// println!("{:?}", instrument); /// } /// ``` fn take_instrument(&mut self) -> Option> { self.activity_mut().instrument.take() } /// Delete the instrument from the current activity /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// # question.set_instrument(uri!("https://example.com")); /// # /// use activitystreams::prelude::*; /// /// assert!(question.instrument().is_some()); /// question.delete_instrument(); /// assert!(question.instrument().is_none()); /// # Ok(()) /// # } /// ``` fn delete_instrument(&mut self) -> &mut Self { self.activity_mut().instrument = None; self } } /// Helper methods for interacting with Activity types with actor and object fields /// /// Documentation for the fields related to these methods can be found on the /// `ActorAndObject` struct pub trait ActorAndObjectRefExt: ActorAndObjectRef { /// Fetch the actor for the current activity, erroring if the actor's domain does not match the /// ID's domain /// /// ```rust /// # use activitystreams::{context, activity::Create}; /// # let mut create = Create::new(context(), context()); /// # /// use activitystreams::prelude::*; /// /// let actor_ref = create.actor(); /// println!("{:?}", actor_ref); /// ``` fn actor<'a, Kind>(&'a self) -> Result<&OneOrMany, DomainError> where Self: BaseExt, Kind: 'a, { let unchecked = self.actor_unchecked(); if unchecked.as_single_id().and_then(|id| id.domain()) != self.id_unchecked().and_then(|id| id.domain()) { return Err(DomainError); } Ok(unchecked) } /// Fetch the actor for the current activity /// /// ```rust /// # use activitystreams::{context, activity::Create}; /// # let mut create = Create::new(context(), context()); /// # /// use activitystreams::prelude::*; /// /// let actor_ref = create.actor_unchecked(); /// println!("{:?}", actor_ref); /// ``` fn actor_unchecked(&self) -> &OneOrMany { self.actor_field_ref() } /// Check if the actor's ID is `id` /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// use activitystreams::prelude::*; /// /// create.set_actor(uri!("https://example.com")); /// /// assert!(create.actor_is(&uri!("https://example.com"))); /// # Ok(()) /// # } /// ``` fn actor_is(&self, id: &Url) -> bool { self.actor_unchecked().is_single_id(id) } /// Set the actor for the current activity /// /// This overwrites the contents of actor /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// /// create.set_actor(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_actor(&mut self, actor: T) -> &mut Self where T: Into, { *self.actor_field_mut() = actor.into().into(); self } /// Set many actors for the current activity /// /// This overwrites the contents of actor /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// /// create.set_many_actors(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_actors(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); *self.actor_field_mut() = v.into(); self } /// Add a actor to the current activity /// /// This does not overwrite the contents of actor, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// /// create /// .add_actor(uri!("https://example.com/one")) /// .add_actor(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_actor(&mut self, actor: T) -> &mut Self where T: Into, { self.actor_field_mut().add(actor.into()); self } /// Fetch the object for the current activity /// /// ```rust /// # use activitystreams::{context, activity::Create}; /// # let mut create = Create::new(context(), context()); /// # /// use activitystreams::prelude::*; /// /// let object_ref = create.object(); /// println!("{:?}", object_ref); /// ``` fn object(&self) -> &OneOrMany { self.object_field_ref() } /// Check if the object's ID is `id` /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// use activitystreams::prelude::*; /// /// create.set_object(uri!("https://example.com")); /// /// assert!(create.object_is(&uri!("https://example.com"))); /// # Ok(()) /// # } /// ``` fn object_is(&self, id: &Url) -> bool { self.object().is_single_id(id) } /// Set the object for the current activity /// /// This overwrites the contents of object /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// /// create.set_object(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_object(&mut self, object: T) -> &mut Self where T: Into, { *self.object_field_mut() = object.into().into(); self } /// Set many objects for the current activity /// /// This overwrites the contents of object /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// /// create.set_many_objects(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_objects(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); *self.object_field_mut() = v.into(); self } /// Add a object to the current activity /// /// This does not overwrite the contents of object, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Create, uri}; /// # let mut create = Create::new(context(), context()); /// /// create /// .add_object(uri!("https://example.com/one")) /// .add_object(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_object(&mut self, object: T) -> &mut Self where T: Into, { self.object_field_mut().add(object.into()); self } } /// 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 { /// Fetch the target for the current activity /// /// ```rust /// # use activitystreams::{context, activity::Invite}; /// # let mut invite = Invite::new(context(), context(), context()); /// # /// use activitystreams::prelude::*; /// /// let target_ref = invite.target(); /// println!("{:?}", target_ref); /// ``` fn target(&self) -> &OneOrMany { self.target_field_ref() } /// Set the target for the current activity /// /// This overwrites the contents of target /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Invite, uri}; /// # let mut invite = Invite::new(context(), context(), context()); /// /// invite.set_target(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_target(&mut self, target: T) -> &mut Self where T: Into, { *self.target_field_mut() = target.into().into(); self } /// Set many targets for the current activity /// /// This overwrites the contents of target /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Invite, uri}; /// # let mut invite = Invite::new(context(), context(), context()); /// /// invite.set_many_targets(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_targets(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); *self.target_field_mut() = v.into(); self } /// Add a target to the current activity /// /// This does not overwrite the contents of target, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Invite, uri}; /// # let mut invite = Invite::new(context(), context(), context()); /// /// invite /// .add_target(uri!("https://example.com/one")) /// .add_target(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_target(&mut self, target: T) -> &mut Self where T: Into, { self.target_field_mut().add(target.into()); self } } /// 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 { /// Fetch the origin for the current activity /// /// ```rust /// # use activitystreams::{context, activity::Arrive}; /// # let mut arrive = Arrive::new(context(), context()); /// # /// use activitystreams::prelude::*; /// /// let origin_ref = arrive.origin(); /// println!("{:?}", origin_ref); /// ``` fn origin(&self) -> &OneOrMany { self.origin_field_ref() } /// Set the origin for the current activity /// /// This overwrites the contents of origin /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Arrive, uri}; /// # let mut arrive = Arrive::new(context(), context()); /// /// arrive.set_origin(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_origin(&mut self, origin: T) -> &mut Self where T: Into, { *self.origin_field_mut() = origin.into().into(); self } /// Set many origins for the current activity /// /// This overwrites the contents of origin /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Arrive, uri}; /// # let mut arrive = Arrive::new(context(), context()); /// /// arrive.set_many_origins(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_origins(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); *self.origin_field_mut() = v.into(); self } /// Add a origin to the current activity /// /// This does not overwrite the contents of origin, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Arrive, uri}; /// # let mut arrive = Arrive::new(context(), context()); /// /// arrive /// .add_origin(uri!("https://example.com/one")) /// .add_origin(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_origin(&mut self, origin: T) -> &mut Self where T: Into, { self.origin_field_mut().add(origin.into()); self } } /// 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 { /// Fetch the target for the current activity /// /// ```rust /// # use activitystreams::{context, activity::Announce}; /// # let mut announce = Announce::new(context(), context()); /// # /// use activitystreams::prelude::*; /// /// if let Some(target_ref) = announce.target() { /// println!("{:?}", target_ref); /// } /// ``` fn target(&self) -> Option<&OneOrMany> { self.target_field_ref().as_ref() } /// Set the target for the current activity /// /// This overwrites the contents of target /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Announce, uri}; /// # let mut announce = Announce::new(context(), context()); /// /// announce.set_target(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_target(&mut self, target: T) -> &mut Self where T: Into, { *self.target_field_mut() = Some(target.into().into()); self } /// Set many targets for the current activity /// /// This overwrites the contents of target /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Announce, uri}; /// # let mut announce = Announce::new(context(), context()); /// /// announce.set_many_targets(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_targets(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); *self.target_field_mut() = Some(v.into()); self } /// Add a target to the current activity /// /// This does not overwrite the contents of target, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Announce, uri}; /// # let mut announce = Announce::new(context(), context()); /// /// announce /// .add_target(uri!("https://example.com/one")) /// .add_target(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_target(&mut self, target: T) -> &mut Self where T: Into, { let c = match self.target_field_mut().take() { Some(mut c) => { c.add(target.into()); c } None => vec![target.into()].into(), }; *self.target_field_mut() = Some(c); self } /// Take a target from the current activity, leaving nothing /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{ /// # context, /// # activity::Announce, /// # }; /// # let mut announce = Announce::new(context(), context()); /// /// if let Some(target) = announce.take_target() { /// println!("{:?}", target); /// } /// # Ok(()) /// # } /// ``` fn take_target(&mut self) -> Option> { self.target_field_mut().take() } /// Delete a target from the current activity /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{ /// # context, /// # activity::Announce, /// # }; /// # let mut announce = Announce::new(context(), context()); /// # announce.set_target(context()); /// /// assert!(announce.target().is_some()); /// announce.delete_target(); /// assert!(announce.target().is_none()); /// # Ok(()) /// # } /// ``` fn delete_target(&mut self) -> &mut Self { *self.target_field_mut() = None; self } } /// Helper methods for interacting with Activity types with an optional origin field /// /// Documentation for the origin field can be found on the /// `Delete` struct pub trait OptOriginRefExt: OptOriginRef { /// Fetch the origin for the current activity /// /// ```rust /// # use activitystreams::{context, activity::Delete}; /// # let mut delete = Delete::new(context(), context()); /// # /// use activitystreams::prelude::*; /// /// if let Some(origin_ref) = delete.origin() { /// println!("{:?}", origin_ref); /// } /// ``` fn origin(&self) -> Option<&OneOrMany> { self.origin_field_ref().as_ref() } /// Set the origin for the current activity /// /// This overwrites the contents of origin /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Delete, uri}; /// # let mut delete = Delete::new(context(), context()); /// /// delete.set_origin(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_origin(&mut self, origin: T) -> &mut Self where T: Into, { *self.origin_field_mut() = Some(origin.into().into()); self } /// Set many origins for the current activity /// /// This overwrites the contents of origin /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Delete, uri}; /// # let mut delete = Delete::new(context(), context()); /// /// delete.set_many_origins(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_origins(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); *self.origin_field_mut() = Some(v.into()); self } /// Add a origin to the current activity /// /// This does not overwrite the contents of origin, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Delete, uri}; /// # let mut delete = Delete::new(context(), context()); /// /// delete /// .add_origin(uri!("https://example.com/one")) /// .add_origin(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_origin(&mut self, origin: T) -> &mut Self where T: Into, { let c = match self.origin_field_mut().take() { Some(mut c) => { c.add(origin.into()); c } None => vec![origin.into()].into(), }; *self.origin_field_mut() = Some(c); self } /// Take a origin from the current activity, leaving nothing /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Delete}; /// # let mut delete = Delete::new(context(), context()); /// /// if let Some(origin) = delete.take_origin() { /// println!("{:?}", origin); /// } /// # Ok(()) /// # } /// ``` fn take_origin(&mut self) -> Option> { self.origin_field_mut().take() } /// Delete a origin from the current activity /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{context, activity::Delete}; /// # let mut delete = Delete::new(context(), context()); /// # delete.set_origin(context()); /// /// assert!(delete.origin().is_some()); /// delete.delete_origin(); /// assert!(delete.origin().is_none()); /// # Ok(()) /// # } /// ``` fn delete_origin(&mut self) -> &mut Self { *self.origin_field_mut() = None; self } } /// Helper methods for interacting with Question types /// /// This trait represents methods valid for an ActivityStreams Question /// /// Documentation for the fields related to these methods can be found on the `Question` /// struct pub trait QuestionExt: AsQuestion { /// Fetch the one_of field for the current activity /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(one_of) = question.one_of() { /// println!("{:?}", one_of); /// } /// ``` fn one_of(&self) -> Option<&OneOrMany> { self.question_ref().one_of.as_ref() } /// Set the one_of field for the current activity /// /// This overwrites the contents of one_of /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_one_of(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_one_of(&mut self, one_of: T) -> &mut Self where T: Into, { self.question_mut().one_of = Some(one_of.into().into()); self } /// Set many one_of items for the current activity /// /// This overwrites the contents of one_of /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_many_one_ofs(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_one_ofs(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); self.question_mut().one_of = Some(v.into()); self } /// Add a one_of to the current activity /// /// This does not overwrite the contents of one_of, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question /// .add_one_of(uri!("https://example.com/one")) /// .add_one_of(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_one_of(&mut self, one_of: T) -> &mut Self where T: Into, { let v = match self.question_mut().one_of.take() { Some(mut v) => { v.add(one_of.into()); v } None => vec![one_of.into()].into(), }; self.question_mut().one_of = Some(v); self } /// Take the one_of field from the current activity, leaving nothing /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(one_of) = question.take_one_of() { /// println!("{:?}", one_of); /// } /// ``` fn take_one_of(&mut self) -> Option> { self.question_mut().one_of.take() } /// Delete the one_of field from the current activity /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// # question.set_one_of(uri!("https://example.com")); /// # /// use activitystreams::prelude::*; /// /// assert!(question.one_of().is_some()); /// question.delete_one_of(); /// assert!(question.one_of().is_none()); /// # Ok(()) /// # } /// ``` fn delete_one_of(&mut self) -> &mut Self { self.question_mut().one_of = None; self } /// Fetch the any_of field for the current activity /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(any_of) = question.any_of() { /// println!("{:?}", any_of); /// } /// ``` fn any_of(&self) -> Option<&OneOrMany> { self.question_ref().any_of.as_ref() } /// Set the any_of field for the current activity /// /// This overwrites the contents of any_of /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_any_of(uri!("https://example.com")); /// # Ok(()) /// # } /// ``` fn set_any_of(&mut self, any_of: T) -> &mut Self where T: Into, { self.question_mut().any_of = Some(any_of.into().into()); self } /// Set many any_of items for the current activity /// /// This overwrites the contents of any_of /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question.set_many_any_ofs(vec![ /// uri!("https://example.com/one"), /// uri!("https://example.com/two"), /// ]); /// # Ok(()) /// # } /// ``` fn set_many_any_ofs(&mut self, items: I) -> &mut Self where I: IntoIterator, T: Into, { let v: Vec<_> = items.into_iter().map(Into::into).collect(); self.question_mut().any_of = Some(v.into()); self } /// Add an any_of to the current activity /// /// This does not overwrite the contents of any_of, only appends an item /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::prelude::*; /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// /// question /// .add_any_of(uri!("https://example.com/one")) /// .add_any_of(uri!("https://example.com/two")); /// # Ok(()) /// # } /// ``` fn add_any_of(&mut self, any_of: T) -> &mut Self where T: Into, { let v = match self.question_mut().any_of.take() { Some(mut v) => { v.add(any_of.into()); v } None => vec![any_of.into()].into(), }; self.question_mut().any_of = Some(v); self } /// Take the any_of field from the current activity, leaving nothing /// /// ```rust /// # use activitystreams::activity::Question; /// # let mut question = Question::new(); /// # /// use activitystreams::prelude::*; /// /// if let Some(any_of) = question.take_any_of() { /// println!("{:?}", any_of); /// } /// ``` fn take_any_of(&mut self) -> Option> { self.question_mut().any_of.take() } /// Delete the any_of field from the current activity /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// # use activitystreams::{activity::Question, uri}; /// # let mut question = Question::new(); /// # question.set_any_of(uri!("https://example.com")); /// # /// use activitystreams::prelude::*; /// /// assert!(question.any_of().is_some()); /// question.delete_any_of(); /// assert!(question.any_of().is_none()); /// # Ok(()) /// # } /// ``` fn delete_any_of(&mut self) -> &mut Self { self.question_mut().any_of = None; self } } /// Indicates that the actor accepts the object. /// /// 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 /// Accept that aren't already present on an ActorAndObject. pub type Accept = ActorAndObject; /// Indicates that the actor has added the object to the target. /// /// 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 ActorAndObject. pub type Add = ActorAndObject; /// Indicates that the actor is blocking the object. /// /// Blocking is a stronger form of Ignore. The typical use is to support social systems that allow /// 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 /// 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 /// 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 /// Dislike that aren't already present on an ActorAndObject. pub type Dislike = ActorAndObject; /// Indicates that the actor is "flagging" the object. /// /// 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 /// Flag that aren't already present on an ActorAndObject. pub type Flag = ActorAndObject; /// Indicates that the actor is "following" the object. /// /// Following is defined in the sense typically used within Social systems in which the actor is /// 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 /// that aren't already present on an ActorAndObject. pub type Follow = ActorAndObject; /// Indicates that the actor is ignoring 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 Ignore /// that aren't already present on an ActorAndObject. pub type Ignore = ActorAndObject; /// Indicates that the actor has joined 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 Join that /// aren't already present on an ActorAndObject. pub type Join = ActorAndObject; /// Indicates that the actor has left the object. /// /// The target and origin typically have no meaning. /// /// This is just an alias for `Object` because there's no fields inherent to Leave that /// aren't already present on an ActorAndObject. pub type Leave = ActorAndObject; /// Indicates that the actor likes, recommends or endorses 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 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 /// 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 /// aren't already present on an ActorAndObject. pub type Read = ActorAndObject; /// Indicates that the actor is rejecting 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 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 /// 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 /// TentativeReject that aren't already present on an ActorAndObject. pub type TentativeReject = ActorAndObject; /// Indicates that the actor is undoing the object. /// /// In most cases, the object will be an Activity describing some previously performed action (for /// instance, a person may have previously "liked" an article but, for whatever reason, might /// choose to undo that like at some later point in time). /// /// The target and origin typically have no defined meaning. /// /// This is just an alias for `Object` because there's no fields inherent to /// Undo that aren't already present on an ActorAndObject. pub type Undo = ActorAndObject; /// Indicates that the actor has updated the object. /// /// Note, however, that this vocabulary does not define a mechanism for describing the actual set /// of modifications made to object. /// /// The target and origin typically have no defined meaning. /// /// This is just an alias for `Object` 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 /// View that aren't already present on an ActorAndObject. pub type View = ActorAndObject; /// Indicates that the actor is calling the target's attention the object. /// /// 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. 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. 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; /// 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, } /// 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, } /// 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, } /// 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, } /// 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, } /// Represents a question being asked. /// /// Question objects are an extension of IntransitiveActivity. That is, the Question object is an /// Activity, but the direct object is the question itself and therefore it would not contain an /// object property. /// /// Either of the anyOf and oneOf properties MAY be used to express possible answers, but a /// Question object MUST NOT have both properties. #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "camelCase")] pub struct Question { /// Identifies an exclusive option for a Question. /// /// Use of one_of implies that the Question can have only a single answer. To indicate that a /// Question can have multiple answers, use any_of. /// /// - Range: Object | Link /// - Functional: false #[serde(skip_serializing_if = "Option::is_none")] one_of: Option>, /// Identifies an inclusive option for a Question. /// /// Use of any_of implies that the Question can have multiple answers. To indicate that a /// Question can have only one answer, use one_of. /// /// - Range: Object | Link /// - Functional: false #[serde(skip_serializing_if = "Option::is_none")] any_of: Option>, /// base fields and unparsed json ends up here #[serde(flatten)] inner: Activity, } impl Activity { /// Create a new Activity /// /// ```rust /// use activitystreams::activity::Activity; /// /// let activity = Activity::::new(); /// ``` pub fn new() -> Self where Kind: Default, { Activity { result: None, instrument: None, inner: Object::new(), } } /// Create a new activity 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::Activity; /// /// let activity = Activity::<()>::new_none_type(); /// /// let s = serde_json::to_string(&activity)?; /// /// assert_eq!(s, "{}"); /// # Ok(()) /// # } /// ``` pub fn new_none_type() -> Self { Activity { result: None, instrument: None, inner: Object::new_none_type(), } } fn extending(mut inner: Object) -> Result { let result = inner.remove("result")?; let instrument = inner.remove("instrument")?; Ok(Activity { result, instrument, inner, }) } fn retracting(self) -> Result, serde_json::Error> { let Activity { result, instrument, mut inner, } = self; inner .insert("result", result)? .insert("instrument", instrument)?; Ok(inner) } } impl ActorAndObject { /// Create a new ActorAndObject Activity /// /// ```rust /// use activitystreams::activity::ActorAndObject; /// /// let activity = ActorAndObject::::new(vec![], vec![]); /// ``` pub fn new(actor: T, object: U) -> Self where T: Into>, U: Into>, Kind: Default, { ActorAndObject { actor: actor.into(), 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 /// /// ```rust /// # fn main() -> Result<(), anyhow::Error> { /// use activitystreams::activity::ActorAndObject; /// /// let activity = ActorAndObject::<()>::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>, { ActorAndObject { actor: actor.into(), object: object.into(), inner: Activity::new_none_type(), } } /// Deconstruct the ActorAndObject into its parts /// /// ```rust /// use activitystreams::activity::ActorAndObject; /// /// let activity = ActorAndObject::::new(vec![], vec![]); /// /// 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() } } impl Arrive { /// Create a new Arrive Activity /// /// ```rust /// use activitystreams::activity::Arrive; /// /// 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( /// vec![], /// vec![] /// ); /// ``` pub fn new(actor: T, object: U) -> Self where T: Into>, U: Into>, Kind: Default, { ActorAndObjectOptOriginAndTarget { actor: actor.into(), object: object.into(), origin: None, target: None, inner: Activity::new(), } } /// Create a new ActorAndObjectOptOriginAndTarget 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::ActorAndObjectOptOriginAndTarget; /// /// let activity = ActorAndObjectOptOriginAndTarget::<()>::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>, { ActorAndObjectOptOriginAndTarget { actor: actor.into(), object: object.into(), origin: None, target: None, inner: Activity::new_none_type(), } } /// Deconstruct the ActorAndObjectOptOriginAndTarget into its parts /// /// ```rust /// use activitystreams::activity::ActorAndObjectOptOriginAndTarget; /// /// let activity = ActorAndObjectOptOriginAndTarget::::new(vec![], vec![]); /// /// let (actor, object, origin, target, activity) = activity.into_parts(); /// ``` pub fn into_parts( self, ) -> ( OneOrMany, OneOrMany, Option>, Option>, Activity, ) { ( self.actor, self.object, self.origin, 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 origin = inner.remove("origin")?; let target = inner.remove("target")?; Ok(ActorAndObjectOptOriginAndTarget { actor, object, origin, target, inner, }) } fn retracting(self) -> Result, serde_json::Error> { let ActorAndObjectOptOriginAndTarget { actor, object, origin, target, mut inner, } = self; inner .insert("actor", actor)? .insert("object", object)? .insert("origin", origin)? .insert("target", target)?; inner.retracting() } } 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 where T: Into>, U: Into>, Kind: Default, { ActorAndObjectOptTarget { actor: actor.into(), object: object.into(), target: None, inner: Activity::new(), } } /// 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 where T: Into>, U: Into>, { ActorAndObjectOptTarget { actor: actor.into(), object: object.into(), target: None, inner: Activity::new_none_type(), } } /// 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) } 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() } } 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>, { Travel { actor: actor.into(), origin: None, target: None, inner: Activity::new(), } } /// 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, }) } fn retracting(self) -> Result, serde_json::Error> { let Travel { actor, origin, target, mut inner, } = self; inner .insert("actor", actor)? .insert("origin", origin)? .insert("target", target)?; inner.retracting() } } impl Question { /// Create a new Question Activity /// /// ```rust /// use activitystreams::activity::Question; /// /// let activity = Question::new(); /// ``` pub fn new() -> Self { Question { one_of: None, any_of: None, inner: Activity::new(), } } /// Deconstruct the Question into its parts /// /// ```rust /// use activitystreams::activity::Question; /// /// let activity = Question::new(); /// /// let (one_of, any_of, activity) = activity.into_parts(); /// ``` pub fn into_parts( self, ) -> ( Option>, Option>, Activity, ) { (self.one_of, self.any_of, self.inner) } fn extending(object: Object) -> Result { let mut inner = Activity::extending(object)?; let one_of = inner.remove("oneOf")?; let any_of = inner.remove("anyOf")?; Ok(Question { one_of, any_of, inner, }) } fn retracting(self) -> Result, serde_json::Error> { let Question { one_of, any_of, mut inner, } = self; inner.insert("oneOf", one_of)?.insert("anyOf", any_of)?; inner.retracting() } } 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 ActorAndObjectOptTarget {} impl markers::Object for ActorAndObjectOptTarget {} impl markers::Activity for ActorAndObjectOptTarget {} impl markers::Base for ActorAndObjectOptOriginAndTarget {} impl markers::Object for ActorAndObjectOptOriginAndTarget {} impl markers::Activity for ActorAndObjectOptOriginAndTarget {} impl markers::Base for Arrive {} impl markers::Object for Arrive {} impl markers::Activity for Arrive {} impl markers::IntransitiveActivity for Arrive {} impl markers::Base for Invite {} impl markers::Object for Invite {} impl markers::Activity for Invite {} 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 Question {} impl markers::Object for Question {} impl markers::Activity for Question {} impl markers::IntransitiveActivity for Question {} impl markers::Activity for ApObject where Inner: markers::Activity {} impl markers::IntransitiveActivity for ApObject where Inner: markers::IntransitiveActivity { } impl Extends for Activity { 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 Activity { 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(activity: Activity) -> Result { activity.retracting() } } impl Extends for ActorAndObject { 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 ActorAndObject { 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(activity: ActorAndObject) -> Result { activity.retracting() } } impl Extends for Arrive { 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 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 { 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(activity: ActorAndObjectOptOriginAndTarget) -> Result { activity.retracting() } } impl Extends for ActorAndObjectOptTarget { 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 ActorAndObjectOptTarget { 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(activity: ActorAndObjectOptTarget) -> Result { activity.retracting() } } impl Extends for Travel { 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 Travel { 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(travel: Travel) -> Result { travel.retracting() } } impl Extends for Question { 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 Question { 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(question: Question) -> Result { question.retracting() } } impl UnparsedMut for Activity { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl UnparsedMut for ActorAndObject { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl UnparsedMut for Arrive { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl UnparsedMut for Invite { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl UnparsedMut for Delete { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl UnparsedMut for ActorAndObjectOptOriginAndTarget { 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 { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl UnparsedMut for Question { fn unparsed_mut(&mut self) -> &mut Unparsed { self.inner.unparsed_mut() } } impl AsBase for Activity { fn base_ref(&self) -> &Base { self.inner.base_ref() } fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } impl AsObject for Activity { fn object_ref(&self) -> &Object { &self.inner } fn object_mut(&mut self) -> &mut Object { &mut self.inner } } impl AsActivity for Activity { fn activity_ref(&self) -> &Activity { self } fn activity_mut(&mut self) -> &mut Activity { self } } impl AsBase for ActorAndObject { fn base_ref(&self) -> &Base { self.inner.base_ref() } fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } impl AsObject for ActorAndObject { fn object_ref(&self) -> &Object { self.inner.object_ref() } fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } impl AsActivity for ActorAndObject { fn activity_ref(&self) -> &Activity { &self.inner } 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 { self.inner.activity_ref() } fn activity_mut(&mut self) -> &mut Activity { self.inner.activity_mut() } } impl OptTargetRef for Travel { fn target_field_ref(&self) -> &Option> { &self.target } fn target_field_mut(&mut self) -> &mut Option> { &mut self.target } } impl OptOriginRef for Travel { fn origin_field_ref(&self) -> &Option> { &self.origin } fn origin_field_mut(&mut self) -> &mut Option> { &mut self.origin } } impl AsBase for Question { fn base_ref(&self) -> &Base { self.inner.base_ref() } fn base_mut(&mut self) -> &mut Base { self.inner.base_mut() } } impl AsObject for Question { fn object_ref(&self) -> &Object { self.inner.object_ref() } fn object_mut(&mut self) -> &mut Object { self.inner.object_mut() } } impl AsActivity for Question { fn activity_ref(&self) -> &Activity { &self.inner } fn activity_mut(&mut self) -> &mut Activity { &mut self.inner } } impl AsQuestion for Question { fn question_ref(&self) -> &Question { self } fn question_mut(&mut self) -> &mut Question { self } } impl AsActivity for ApObject where Inner: AsActivity, { fn activity_ref(&self) -> &Activity { self.inner().activity_ref() } fn activity_mut(&mut self) -> &mut Activity { self.inner_mut().activity_mut() } } impl ActorAndObjectRef for ApObject where Inner: ActorAndObjectRef, { fn actor_field_ref(&self) -> &OneOrMany { self.inner().actor_field_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() } } impl TargetRef for ApObject where Inner: TargetRef, { fn target_field_ref(&self) -> &OneOrMany { self.inner().target_field_ref() } fn target_field_mut(&mut self) -> &mut OneOrMany { self.inner_mut().target_field_mut() } } impl OriginRef for ApObject where Inner: OriginRef, { fn origin_field_ref(&self) -> &OneOrMany { self.inner().origin_field_ref() } fn origin_field_mut(&mut self) -> &mut OneOrMany { self.inner_mut().origin_field_mut() } } impl OptTargetRef for ApObject where Inner: OptTargetRef, { fn target_field_ref(&self) -> &Option> { self.inner().target_field_ref() } fn target_field_mut(&mut self) -> &mut Option> { self.inner_mut().target_field_mut() } } impl OptOriginRef for ApObject where Inner: OptOriginRef, { fn origin_field_ref(&self) -> &Option> { self.inner().origin_field_ref() } fn origin_field_mut(&mut self) -> &mut Option> { self.inner_mut().origin_field_mut() } } impl AsQuestion for ApObject where Inner: AsQuestion, { fn question_ref(&self) -> &Question { self.inner().question_ref() } fn question_mut(&mut self) -> &mut Question { self.inner_mut().question_mut() } } 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 QuestionExt for T where T: AsQuestion {}