activitystreams-new/src/actor.rs

898 lines
28 KiB
Rust
Raw Normal View History

2020-05-16 22:19:15 +00:00
//! Types and traits for dealing with Actor attributes
//!
//! ```rust
//! # fn main() -> Result<(), anyhow::Error> {
//! use activitystreams_new::{
//! actor::{ApActor, Person},
//! prelude::*,
//! primitives::XsdAnyUri,
//! };
//!
//! let mut person = ApActor::<Person>::default();
//!
//! person
//! .set_inbox("https://example.com/actor/inbox".parse()?)
//! .set_outbox("https://example.com/actor/outbox".parse()?)
//! .set_following("https://example.com/actor/following".parse()?)
//! .set_followers("https://example.com/actor/followers".parse()?);
//! #
//! # Ok(())
//! # }
//! ```
2020-05-14 03:54:50 +00:00
use crate::{
2020-05-15 22:01:29 +00:00
base::{AsBase, Base, Extends},
markers,
object::{ApObject, AsApObject, AsObject, Object},
primitives::{OneOrMany, XsdAnyUri, XsdString},
unparsed::{Unparsed, UnparsedMut, UnparsedMutExt},
2020-05-14 03:54:50 +00:00
};
2020-05-14 16:23:38 +00:00
use typed_builder::TypedBuilder;
2020-05-14 03:54:50 +00:00
pub mod kind {
2020-05-16 22:19:15 +00:00
//! Kinds of actors defined by the spec
//!
//! These types exist only to be statically-typed versions of the associated string. e.g.
//! `PersonType` -> `"Person"`
2020-05-14 03:54:50 +00:00
pub use activitystreams::actor::kind::*;
}
use self::kind::*;
2020-05-16 22:19:15 +00:00
/// Implementation trait for deriving ActivityPub Actor methods for a type
///
/// Any type implementing AsObject will automatically gain methods provided by ApActorExt
2020-05-15 22:01:29 +00:00
pub trait AsApActor<Inner>: markers::Actor {
2020-05-16 22:19:15 +00:00
/// Immutable borrow of `ApActor<Inner>`
2020-05-15 03:18:34 +00:00
fn ap_actor_ref(&self) -> &ApActor<Inner>;
2020-05-16 22:19:15 +00:00
/// Mutable borrow of `ApActor<Inner>`
2020-05-15 03:18:34 +00:00
fn ap_actor_mut(&mut self) -> &mut ApActor<Inner>;
}
2020-05-16 22:19:15 +00:00
/// Helper methods for interacting with ActivityPub Actor types
///
/// This trait represents methods valid for any ActivityPub Actor.
///
/// Documentation for the fields related to these methods can be found on the `ApActor` struct
2020-05-15 22:01:29 +00:00
pub trait ApActorExt<Inner>: AsApActor<Inner> {
2020-05-16 22:19:15 +00:00
/// Fetch the inbox for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// let inbox_ref = person.inbox();
/// ```
2020-05-15 03:18:34 +00:00
fn inbox<'a>(&'a self) -> &'a XsdAnyUri
where
Inner: 'a,
{
&self.ap_actor_ref().inbox
}
2020-05-16 22:19:15 +00:00
/// Set the inbox for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_inbox("https://example.com/inbox".parse()?);
/// # Ok(())
/// # }
/// ```
2020-05-15 22:01:29 +00:00
fn set_inbox(&mut self, inbox: XsdAnyUri) -> &mut Self {
self.ap_actor_mut().inbox = inbox;
self
2020-05-15 03:18:34 +00:00
}
2020-05-16 22:19:15 +00:00
/// Fetch the outbox for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// let outbox_ref = person.outbox();
/// ```
2020-05-15 22:01:29 +00:00
fn outbox<'a>(&'a self) -> &'a XsdAnyUri
2020-05-15 03:18:34 +00:00
where
Inner: 'a,
{
2020-05-15 22:01:29 +00:00
&self.ap_actor_ref().outbox
2020-05-15 03:18:34 +00:00
}
2020-05-16 22:19:15 +00:00
/// Set the outbox for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_outbox("https://example.com/outbox".parse()?);
/// # Ok(())
/// # }
/// ```
2020-05-15 22:01:29 +00:00
fn set_outbox(&mut self, outbox: XsdAnyUri) -> &mut Self {
self.ap_actor_mut().outbox = outbox;
self
2020-05-15 03:18:34 +00:00
}
2020-05-16 22:19:15 +00:00
/// Fetch the following link for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(following) = person.following() {
/// println!("{:?}", following);
/// }
/// ```
2020-05-15 22:01:29 +00:00
fn following<'a>(&'a self) -> Option<&'a XsdAnyUri>
2020-05-15 03:18:34 +00:00
where
Inner: 'a,
{
2020-05-15 22:01:29 +00:00
self.ap_actor_ref().following.as_ref()
2020-05-15 03:18:34 +00:00
}
2020-05-16 22:19:15 +00:00
/// Set the following link for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_following("https://example.com/following".parse()?);
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_following(&mut self, following: XsdAnyUri) -> &mut Self {
self.ap_actor_mut().following = Some(following);
self
}
2020-05-16 22:19:15 +00:00
/// Take the following link for the current actor, leaving nothing
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(following) = person.take_following() {
/// println!("{:?}", following);
/// }
/// ```
2020-05-15 03:18:34 +00:00
fn take_following(&mut self) -> Option<XsdAnyUri> {
self.ap_actor_mut().following.take()
}
2020-05-16 22:19:15 +00:00
/// Delete the following link from the current object
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// # person.set_following("https://example.com/following".parse()?);
/// use activitystreams_new::prelude::*;
///
/// assert!(person.following().is_some());
/// person.delete_following();
/// assert!(person.following().is_none());
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn delete_following(&mut self) -> &mut Self {
self.ap_actor_mut().following = None;
self
}
2020-05-16 22:19:15 +00:00
/// Fetch the followers link for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(followers) = person.take_followers() {
/// println!("{:?}", followers);
/// }
/// ```
2020-05-15 22:01:29 +00:00
fn followers<'a>(&'a self) -> Option<&'a XsdAnyUri>
where
Inner: 'a,
{
self.ap_actor_ref().followers.as_ref()
}
2020-05-16 22:19:15 +00:00
/// Set the followers link for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_followers("https://example.com/followers".parse()?);
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_followers(&mut self, followers: XsdAnyUri) -> &mut Self {
self.ap_actor_mut().followers = Some(followers);
self
}
2020-05-16 22:19:15 +00:00
/// Take the followers link for the current actor, leaving nothing
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(followers) = person.take_followers() {
/// println!("{:?}", followers);
/// }
/// ```
2020-05-15 03:18:34 +00:00
fn take_followers(&mut self) -> Option<XsdAnyUri> {
self.ap_actor_mut().followers.take()
}
2020-05-16 22:19:15 +00:00
/// Delete the followers link from the current object
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// # person.set_followers("https://example.com/followers".parse()?);
/// use activitystreams_new::prelude::*;
///
/// assert!(person.followers().is_some());
/// person.delete_followers();
/// assert!(person.followers().is_none());
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn delete_followers(&mut self) -> &mut Self {
self.ap_actor_mut().followers = None;
self
}
2020-05-16 22:19:15 +00:00
/// Fetch the liked link for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(liked) = person.take_liked() {
/// println!("{:?}", liked);
/// }
/// ```
2020-05-15 22:01:29 +00:00
fn liked<'a>(&'a self) -> Option<&'a XsdAnyUri>
where
Inner: 'a,
{
self.ap_actor_ref().liked.as_ref()
}
2020-05-16 22:19:15 +00:00
/// Set the liked link for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_streams("https://example.com/liked".parse()?);
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_liked(&mut self, liked: XsdAnyUri) -> &mut Self {
self.ap_actor_mut().liked = Some(liked);
self
}
2020-05-16 22:19:15 +00:00
/// Take the liked link for the current actor, leaving nothing
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(liked) = person.take_liked() {
/// println!("{:?}", liked);
/// }
/// ```
2020-05-15 03:18:34 +00:00
fn take_liked(&mut self) -> Option<XsdAnyUri> {
self.ap_actor_mut().liked.take()
}
2020-05-16 22:19:15 +00:00
/// Delete the liked link from the current object
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// # person.set_liked("https://example.com/liked".parse()?);
/// use activitystreams_new::prelude::*;
///
/// assert!(person.liked().is_some());
/// person.delete_liked();
/// assert!(person.liked().is_none());
/// # Ok(())
/// # }
/// ```
2020-05-15 22:01:29 +00:00
fn delete_liked(&mut self) -> &mut Self {
2020-05-15 03:18:34 +00:00
self.ap_actor_mut().liked = None;
self
}
2020-05-16 22:19:15 +00:00
/// Fetch the streams links for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(streams) = person.take_streams() {
/// println!("{:?}", streams);
/// }
/// ```
2020-05-15 22:01:29 +00:00
fn streams<'a>(&'a self) -> Option<&'a OneOrMany<XsdAnyUri>>
where
Inner: 'a,
{
self.ap_actor_ref().streams.as_ref()
}
2020-05-16 22:19:15 +00:00
/// Set the streams links for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_streams("https://example.com/streams".parse()?);
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_streams(&mut self, streams: XsdAnyUri) -> &mut Self {
self.ap_actor_mut().streams = Some(streams.into());
self
}
2020-05-16 22:19:15 +00:00
/// Set many streams links for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_many_streams(vec![
/// "https://example.com/streams1".parse()?,
/// "https://example.com/streams2".parse()?
/// ]);
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_many_streams<I>(&mut self, items: I) -> &mut Self
where
I: IntoIterator<Item = XsdAnyUri>,
{
let v: Vec<_> = items.into_iter().collect();
self.ap_actor_mut().streams = Some(v.into());
self
}
2020-05-16 22:19:15 +00:00
/// Add a streams link for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person
/// .add_streams("https://example.com/streams1".parse()?)
/// .add_streams("https://example.com/streams2".parse()?);
/// # Ok(())
/// # }
/// ```
fn add_streams(&mut self, stream: XsdAnyUri) -> &mut Self {
2020-05-15 03:18:34 +00:00
let v = match self.ap_actor_mut().streams.take() {
Some(mut v) => {
v.add(stream);
v
}
None => vec![stream].into(),
};
self.ap_actor_mut().streams = Some(v);
self
}
2020-05-16 22:19:15 +00:00
/// Take the streams links for the current actor, leaving nothing
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(streams) = person.take_streams() {
/// println!("{:?}", streams);
/// }
/// ```
2020-05-15 03:18:34 +00:00
fn take_streams(&mut self) -> Option<OneOrMany<XsdAnyUri>> {
self.ap_actor_mut().streams.take()
}
2020-05-16 22:19:15 +00:00
/// Delete the streams links from the current object
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// # person.set_streams("https://example.com/streams".parse()?);
/// use activitystreams_new::prelude::*;
///
/// assert!(person.streams().is_some());
/// person.delete_streams();
/// assert!(person.streams().is_none());
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn delete_streams(&mut self) -> &mut Self {
self.ap_actor_mut().streams = None;
self
}
2020-05-16 22:19:15 +00:00
/// Fetch the preferred_username for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(preferred_username) = person.preferred_username() {
/// println!("{:?}", preferred_username);
/// }
/// ```
2020-05-15 22:01:29 +00:00
fn preferred_username<'a>(&'a self) -> Option<&'a XsdString>
where
Inner: 'a,
{
self.ap_actor_ref().preferred_username.as_ref()
}
2020-05-16 22:19:15 +00:00
/// Set the preferred_username for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_preferred_username("user123".into());
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_preferred_username(&mut self, string: XsdString) -> &mut Self {
self.ap_actor_mut().preferred_username = Some(string);
self
}
2020-05-16 22:19:15 +00:00
/// Take the preferred_username from the current actor, leaving nothing
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(preferred_username) = person.take_preferred_username() {
/// println!("{:?}", preferred_username);
/// }
/// ```
2020-05-15 03:18:34 +00:00
fn take_preferred_username(&mut self) -> Option<XsdString> {
self.ap_actor_mut().preferred_username.take()
}
2020-05-16 22:19:15 +00:00
/// Delete the preferred_username from the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// # person.set_preferred_username("hey".into());
/// use activitystreams_new::prelude::*;
///
/// assert!(person.preferred_username().is_some());
/// person.delete_preferred_username();
/// assert!(person.preferred_username().is_none());
/// ```
2020-05-15 03:18:34 +00:00
fn delete_preferred_username(&mut self) -> &mut Self {
self.ap_actor_mut().preferred_username = None;
self
}
2020-05-16 22:19:15 +00:00
/// Fetch the endpoints for the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(endpoints) = person.endpoints() {
/// println!("{:?}", endpoints);
/// }
/// ```
2020-05-15 22:01:29 +00:00
fn endpoints<'a>(&'a self) -> Option<&'a Endpoints>
where
Inner: 'a,
{
self.ap_actor_ref().endpoints.as_ref()
}
2020-05-16 22:19:15 +00:00
/// Set the endpoints for the current actor
///
/// ```rust
/// # fn main() -> Result<(), anyhow::Error> {
/// # use activitystreams_new::actor::{ApActor, Endpoints, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// person.set_endpoints(Endpoints {
/// shared_inbox: Some("https://example.com/inbox".parse()?),
/// ..Default::default()
/// });
/// # Ok(())
/// # }
/// ```
2020-05-15 03:18:34 +00:00
fn set_endpoints(&mut self, endpoints: Endpoints) -> &mut Self {
self.ap_actor_mut().endpoints = Some(endpoints);
self
}
2020-05-16 22:19:15 +00:00
/// Take the endpoints from the current actor, leaving nothing
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// use activitystreams_new::prelude::*;
///
/// if let Some(endpoints) = person.endpoints() {
/// println!("{:?}", endpoints);
/// }
/// ```
2020-05-15 03:18:34 +00:00
fn take_endpoints(&mut self) -> Option<Endpoints> {
self.ap_actor_mut().endpoints.take()
}
2020-05-16 22:19:15 +00:00
/// Delete the endpoints from the current actor
///
/// ```rust
/// # use activitystreams_new::actor::{ApActor, Person};
/// # let mut person = ApActor::<Person>::default();
/// # person.set_endpoints(Default::default());
/// use activitystreams_new::prelude::*;
///
/// assert!(person.endpoints().is_some());
/// person.delete_endpoints();
/// assert!(person.endpoints().is_none());
/// ```
2020-05-15 03:18:34 +00:00
fn delete_endpoints(&mut self) -> &mut Self {
self.ap_actor_mut().endpoints = None;
self
}
}
2020-05-14 03:54:50 +00:00
pub type Application = Object<ApplicationType>;
pub type Group = Object<GroupType>;
pub type Organization = Object<OrganizationType>;
pub type Person = Object<PersonType>;
pub type Service = Object<ServiceType>;
2020-05-16 22:19:15 +00:00
/// Define activitypub properties for the Actor type as described by the Activity Pub vocabulary.
2020-05-14 16:23:38 +00:00
#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize, TypedBuilder)]
2020-05-14 03:54:50 +00:00
#[serde(rename_all = "camelCase")]
2020-05-14 16:23:38 +00:00
#[builder(doc)]
2020-05-14 03:54:50 +00:00
pub struct ApActor<Inner> {
2020-05-16 22:19:15 +00:00
/// A reference to an [ActivityStreams] OrderedCollection comprised of all the messages received by the actor.
///
/// - Range: xsd:anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
pub inbox: XsdAnyUri,
2020-05-16 22:19:15 +00:00
/// An ActivityStreams] OrderedCollection comprised of all the messages produced by the actor.
///
/// - Range: xsd:anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
pub outbox: XsdAnyUri,
2020-05-16 22:19:15 +00:00
/// A link to an [ActivityStreams] collection of the actors that this actor is following.
///
/// - Range: xsd:anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub following: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// A link to an [ActivityStreams] collection of the actors that follow this actor.
///
/// - Range: xsd:anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub followers: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// A link to an [ActivityStreams] collection of objects this actor has liked.
///
/// - Range: xsd:anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub liked: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// A list of supplementary Collections which may be of interest.
///
/// - Range: xsd:anyUri
/// - Functional: false
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option, into))]
2020-05-14 03:54:50 +00:00
pub streams: Option<OneOrMany<XsdAnyUri>>,
2020-05-16 22:19:15 +00:00
/// A short username which may be used to refer to the actor, with no uniqueness guarantees.
///
/// - Range: xsd:string
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub preferred_username: Option<XsdString>,
2020-05-16 22:19:15 +00:00
/// A json object which maps additional (typically server/domain-wide) endpoints which may be
/// useful either for this actor or someone referencing this actor.
///
/// This mapping may be nested inside the actor document as the value or may be a link to a
/// JSON-LD document with these properties.
///
/// - Range: Endpoint
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub endpoints: Option<Endpoints>,
2020-05-16 22:19:15 +00:00
/// base fields and unparsed json ends up here
2020-05-14 03:54:50 +00:00
#[serde(flatten)]
pub inner: Inner,
}
2020-05-16 22:19:15 +00:00
/// A json object which maps additional (typically server/domain-wide) endpoints which may be
/// useful either for this actor or someone referencing this actor.
///
/// This mapping may be nested inside the actor document as the value or may be a link to a
/// JSON-LD document with these properties.
2020-05-14 16:23:38 +00:00
#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize, TypedBuilder)]
2020-05-14 03:54:50 +00:00
#[serde(rename_all = "camelCase")]
pub struct Endpoints {
2020-05-16 22:19:15 +00:00
/// Endpoint URI so this actor's clients may access remote ActivityStreams objects which
/// require authentication to access.
///
/// To use this endpoint, the client posts an x-www-form-urlencoded id parameter with the
/// value being the id of the requested ActivityStreams object.
///
/// - Range: anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub proxy_url: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// If OAuth 2.0 bearer tokens [RFC6749](https://tools.ietf.org/html/rfc6749)
/// [RFC6750](https://tools.ietf.org/html/rfc6750) are being used for authenticating client to
/// server interactions, this endpoint specifies a URI at which a browser-authenticated user
/// may obtain a new authorization grant.
///
/// - Range: anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub oauth_authorization_endpoint: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// If OAuth 2.0 bearer tokens [RFC6749](https://tools.ietf.org/html/rfc6749)
/// [RFC6750](https://tools.ietf.org/html/rfc6750) are being used for authenticating client to
/// server interactions, this endpoint specifies a URI at which a client may acquire an access
/// token.
///
/// - Range: anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub oauth_token_endpoint: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// If Linked Data Signatures and HTTP Signatures are being used for authentication and
/// authorization, this endpoint specifies a URI at which browser-authenticated users may
/// authorize a client's public key for client to server interactions.
///
/// - Range: anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub provide_client_key: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// If Linked Data Signatures and HTTP Signatures are being used for authentication and
/// authorization, this endpoint specifies a URI at which a client key may be signed by the
/// actor's key for a time window to act on behalf of the actor in interacting with foreign
/// servers.
///
/// - Range: anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub sign_client_key: Option<XsdAnyUri>,
2020-05-16 22:19:15 +00:00
/// An optional endpoint used for wide delivery of publicly addressed activities and
/// activities sent to followers.
///
/// shared_inbox endpoints SHOULD also be publicly readable OrderedCollection objects
/// containing objects addressed to the Public special collection. Reading from the
/// shared_inbox endpoint MUST NOT present objects which are not addressed to the Public
/// endpoint.
///
/// - Range: anyUri
/// - Functional: true
2020-05-14 03:54:50 +00:00
#[serde(skip_serializing_if = "Option::is_none")]
2020-05-14 16:23:38 +00:00
#[builder(default, setter(strip_option))]
2020-05-14 03:54:50 +00:00
pub shared_inbox: Option<XsdAnyUri>,
}
impl<Inner> ApActor<Inner> {
fn extending(mut inner: Inner) -> Result<Self, serde_json::Error>
where
2020-05-15 22:01:29 +00:00
Inner: UnparsedMut + markers::Actor,
2020-05-14 03:54:50 +00:00
{
let inbox = inner.remove("inbox")?;
let outbox = inner.remove("outbox")?;
let following = inner.remove("following")?;
let followers = inner.remove("followers")?;
let liked = inner.remove("liked")?;
let streams = inner.remove("streams")?;
let preferred_username = inner.remove("preferredUsername")?;
let endpoints = inner.remove("endpoints")?;
Ok(ApActor {
inbox,
outbox,
following,
followers,
liked,
streams,
preferred_username,
endpoints,
inner,
})
}
fn retracting(self) -> Result<Inner, serde_json::Error>
where
2020-05-15 22:01:29 +00:00
Inner: UnparsedMut + markers::Actor,
2020-05-14 03:54:50 +00:00
{
let ApActor {
inbox,
outbox,
following,
followers,
liked,
streams,
preferred_username,
endpoints,
mut inner,
} = self;
inner
.insert("endpoints", endpoints)?
.insert("preferredUsername", preferred_username)?
.insert("streams", streams)?
.insert("liked", liked)?
.insert("followers", followers)?
.insert("following", following)?
.insert("outbox", outbox)?
.insert("inbox", inbox)?;
Ok(inner)
}
}
2020-05-15 22:01:29 +00:00
impl markers::Actor for Application {}
impl markers::Actor for Group {}
impl markers::Actor for Organization {}
impl markers::Actor for Person {}
impl markers::Actor for Service {}
2020-05-14 03:54:50 +00:00
2020-05-15 22:01:29 +00:00
impl<Inner> markers::Base for ApActor<Inner> where Inner: markers::Base {}
impl<Inner> markers::Object for ApActor<Inner> where Inner: markers::Object {}
impl<Inner> markers::Actor for ApActor<Inner> where Inner: markers::Actor {}
2020-05-14 03:54:50 +00:00
2020-05-15 22:01:29 +00:00
impl<Inner, Kind> Extends<Kind> for ApActor<Inner>
2020-05-14 03:54:50 +00:00
where
2020-05-15 22:01:29 +00:00
Inner: Extends<Kind, Error = serde_json::Error> + UnparsedMut + markers::Actor,
Kind: serde::de::DeserializeOwned + serde::ser::Serialize,
2020-05-14 03:54:50 +00:00
{
type Error = serde_json::Error;
2020-05-15 22:01:29 +00:00
fn extends(base: Base<Kind>) -> Result<Self, Self::Error> {
let inner = Inner::extends(base)?;
2020-05-14 03:54:50 +00:00
Self::extending(inner)
}
2020-05-15 22:01:29 +00:00
fn retracts(self) -> Result<Base<Kind>, Self::Error> {
let inner = self.retracting()?;
inner.retracts()
2020-05-14 03:54:50 +00:00
}
}
2020-05-15 03:18:34 +00:00
impl<Inner> UnparsedMut for ApActor<Inner>
2020-05-14 03:54:50 +00:00
where
2020-05-15 03:18:34 +00:00
Inner: UnparsedMut,
2020-05-14 03:54:50 +00:00
{
fn unparsed_mut(&mut self) -> &mut Unparsed {
self.inner.unparsed_mut()
}
}
2020-05-15 03:18:34 +00:00
2020-05-15 22:01:29 +00:00
impl<Inner, Kind> AsBase<Kind> for ApActor<Inner>
2020-05-15 03:18:34 +00:00
where
2020-05-15 22:01:29 +00:00
Inner: AsBase<Kind>,
2020-05-15 03:18:34 +00:00
{
2020-05-15 22:01:29 +00:00
fn base_ref(&self) -> &Base<Kind> {
self.inner.base_ref()
}
fn base_mut(&mut self) -> &mut Base<Kind> {
self.inner.base_mut()
2020-05-15 03:18:34 +00:00
}
}
2020-05-15 22:01:29 +00:00
impl<Inner, Kind> AsObject<Kind> for ApActor<Inner>
2020-05-15 03:18:34 +00:00
where
2020-05-15 22:01:29 +00:00
Inner: AsObject<Kind>,
2020-05-15 03:18:34 +00:00
{
2020-05-15 22:01:29 +00:00
fn object_ref(&self) -> &Object<Kind> {
self.inner.object_ref()
}
2020-05-15 03:18:34 +00:00
fn object_mut(&mut self) -> &mut Object<Kind> {
self.inner.object_mut()
}
}
2020-05-15 22:01:29 +00:00
impl<Inner> AsApActor<Inner> for ApActor<Inner>
2020-05-15 03:18:34 +00:00
where
2020-05-15 22:01:29 +00:00
Inner: markers::Actor,
2020-05-15 03:18:34 +00:00
{
fn ap_actor_ref(&self) -> &ApActor<Inner> {
self
}
2020-05-15 22:01:29 +00:00
fn ap_actor_mut(&mut self) -> &mut ApActor<Inner> {
self
}
2020-05-15 03:18:34 +00:00
}
2020-05-15 22:01:29 +00:00
impl<Inner1, Inner2> AsApObject<Inner2> for ApActor<Inner1>
2020-05-15 03:18:34 +00:00
where
2020-05-15 22:01:29 +00:00
Inner1: AsApObject<Inner2>,
2020-05-15 03:18:34 +00:00
{
2020-05-15 22:01:29 +00:00
fn ap_object_ref(&self) -> &ApObject<Inner2> {
self.inner.ap_object_ref()
}
fn ap_object_mut(&mut self) -> &mut ApObject<Inner2> {
self.inner.ap_object_mut()
2020-05-15 03:18:34 +00:00
}
}
2020-05-15 22:01:29 +00:00
impl<T, Inner> ApActorExt<Inner> for T where T: AsApActor<Inner> {}