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,
}
}
}
}
}