rustpub 0.1.2

An implementation of the Activitypub types
Documentation
use derive_builder::Builder;
use serde::{Serialize, Deserialize};

use crate::properties::*;

#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum ObjectEnum {
    Brief(String),
    #[serde(rename_all = "camelCase")]
    Full {
        #[serde(skip_serializing_if = "Option::is_none")]
        attachment: Option<Attachment>,
        #[serde(skip_serializing_if = "Option::is_none")]
        attributed_to: Option<AttributedTo>,
        #[serde(skip_serializing_if = "Option::is_none")]
        audience: Option<Audience>,
        #[serde(alias = "contentMap", skip_serializing_if = "Option::is_none")]
        content: Option<Content>,
        #[serde(rename = "@context", skip_serializing_if = "Option::is_none")]
        context: Option<Context>,
        #[serde(skip_serializing_if = "Option::is_none")]
        generator: Option<Generator>,
        #[serde(skip_serializing_if = "Option::is_none")]
        in_reply_to: Option<InReplyTo>,
        #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
        kind: Option<Kind>,
        #[serde(skip_serializing_if = "Option::is_none")]
        id: Option<Id>,
        #[serde(skip_serializing_if = "Option::is_none")]
        media_type: Option<MediaType>,
        #[serde(alias = "nameMap", skip_serializing_if = "Option::is_none")]
        name: Option<Name>,
        #[serde(alias ="summaryMap", skip_serializing_if = "Option::is_none")]
        summary: Option<Summary>,
        #[serde(skip_serializing_if = "Option::is_none")]
        tag: Option<Tag>,
        #[serde(skip_serializing_if = "Option::is_none")]
        url: Option<Url>,
        #[serde(skip_serializing_if = "Option::is_none")]
        inbox: Option<Inbox>,
        #[serde(skip_serializing_if = "Option::is_none")]
        outbox: Option<Inbox>,
    },
}

#[derive(Clone, Debug, Default, Serialize, Deserialize, Builder)]
#[serde(rename_all = "camelCase", from = "ObjectEnum")]
#[builder(default, setter(strip_option))]
pub struct Object {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub attachment: Option<Attachment>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub attributed_to: Option<AttributedTo>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub audience: Option<Audience>,
    #[serde(alias = "contentMap", skip_serializing_if = "Option::is_none")]
    pub content: Option<Content>,
    #[serde(rename = "@context", skip_serializing_if = "Option::is_none")]
    pub context: Option<Context>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub generator: Option<Generator>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub in_reply_to: Option<InReplyTo>,
    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
    pub kind: Option<Kind>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<Id>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub media_type: Option<MediaType>,
    #[serde(alias = "nameMap", skip_serializing_if = "Option::is_none")]
    pub name: Option<Name>,
    #[serde(alias ="summaryMap", skip_serializing_if = "Option::is_none")]
    pub summary: Option<Summary>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tag: Option<Tag>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<Url>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub inbox: Option<Inbox>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub outbox: Option<Inbox>,
}

impl From<ObjectEnum> for Object {
    fn from(object_enum: ObjectEnum) -> Self {
        match object_enum {
            ObjectEnum::Brief(id) => {
                ObjectBuilder::default()
                    .id(id)
                    .build()
                    .unwrap()
            },
            ObjectEnum::Full{
                attachment,
                attributed_to,
                audience,
                content,
                context,
                generator,
                in_reply_to,
                kind,
                id,
                media_type,
                name,
                summary,
                tag,
                url,
                inbox,
                outbox,
            } => {
                Object {
                    attachment,
                    attributed_to,
                    audience,
                    content,
                    context,
                    generator,
                    in_reply_to,
                    kind,
                    id,
                    media_type,
                    name,
                    summary,
                    tag,
                    url,
                    inbox,
                    outbox,
                }
            }
        }
    }
}

#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum LinkEnum {
    Brief(String),
    Full {
        #[serde(skip_serializing_if = "Option::is_none")]
        href: Option<Href>,
        #[serde(skip_serializing_if = "Option::is_none")]
        media_type: Option<MediaType>,
        #[serde(alias ="nameMap", skip_serializing_if = "Option::is_none")]
        name: Option<Name>,
    },
}

#[derive(Clone, Debug, Default, Serialize, Deserialize, Builder)]
#[serde(rename_all = "camelCase", from = "LinkEnum")]
#[builder(default, setter(strip_option))]
pub struct Link {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub href: Option<Href>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub media_type: Option<MediaType>,
    #[serde(alias ="nameMap", skip_serializing_if = "Option::is_none")]
    pub name: Option<Name>,
}

impl From<LinkEnum> for Link {
    fn from(link_enum: LinkEnum) -> Self {
        match link_enum {
            LinkEnum::Brief(href) => {
                LinkBuilder::default()
                    .href(href)
                    .build()
                    .unwrap()
            },
            LinkEnum::Full {
                href,
                media_type,
                name,
            } => {
                Link {
                    href,
                    media_type,
                    name,
                }
            }
        }
    }
}