diff options
Diffstat (limited to 'src/types/content.rs')
-rw-r--r-- | src/types/content.rs | 168 |
1 files changed, 1 insertions, 167 deletions
diff --git a/src/types/content.rs b/src/types/content.rs index 3280757..c22a41f 100644 --- a/src/types/content.rs +++ b/src/types/content.rs @@ -4,6 +4,7 @@ use crate::types::util::IPFSHash; use crate::types::util::IPNSHash; use crate::types::util::MimeType; use crate::types::util::Timestamp; +use crate::types::payload::*; #[derive(Serialize, Deserialize, Debug)] pub struct Content { @@ -66,170 +67,3 @@ impl AsRef<Content> for Content { } } -/// The Payload type represents the Payload of a Content object -/// -/// The Payload type contains several variants, as an update (new block) may be either just a -/// metadata update (like a merge) or something more meaningful. -/// -/// For example, the payload might be a `Payload::Post`, Alice has posted new kitten pictures! -/// Or a `Payload::ProfileUpdate` which contains information about Alice herself -/// -#[derive(Serialize, Deserialize, Debug)] -#[serde(tag = "payload_type")] -pub enum Payload { - - /// A variant that represents no payload - /// - /// This normally happens when merging two chains. - None, - - /// A post - /// - /// A post can be anything which contains data. The data itself is put behind an IPFS hash, the - /// Payload::Post only contains meta-information like payload size, content format (MIME) and - /// optionally a list of IPFS hashes which are related to the post itself. - Post { - /// Format of the actual content - #[serde(rename = "content-format")] - content_format: MimeType, - - /// IPFS hash pointing to the actual content - #[serde(rename = "content")] - content: IPFSHash, - - /// If this post is a reply to another post, this field can be used to point to the - /// replied-to post. - #[serde(rename = "reply-to")] - #[serde(default)] - reply_to: Option<IPFSHash>, - - // - // - // Metadata for the post which should be visible to others - // - // - - /// A flag whether comments to this post will be propagated - /// - /// From a technical POV, comments can be done anyways, but the client which published the - /// comment has to "accept" comments (via `PostComments`) to make them visible to others. - /// This flag indicates whether the client will do that (either manually or automatically, - /// which is not indicated here). - /// - /// # Available values - /// - /// A value of `Some(false)` means that comments will not be propagated, so others will not - /// see them. A UI may not show "add comment"-buttons if this is set to `Some(false)`. - /// - /// A value of `Some(true)` means that comments will eventually be propagated. This means - /// that the author might accept them by hand or tell their client to automatically accept - /// all comments. This distinction is client-side implementation specific. - /// - /// A value of `None` indicates no setting here, which means that the client might or might - /// not propagate any comments. - #[serde(rename = "comments-will-be-propagated")] - #[serde(default)] - comments_will_be_propagated: Option<bool>, - - /// A value which describes until what date/time comments will be propagated - /// - /// This is a hint for other users whether comments will be propagated or not. - /// A UI might not show a "Reply" button after that date. - #[serde(rename = "comments-propagated-until")] - #[serde(default)] - comments_propagated_until: Option<Timestamp>, - }, - - /// Comments for a post - /// - /// Propagating answers to a post must be done by the author of the post itself. - /// This variant is for publishing a message "These are the comments on my post <hash>". - /// - /// Always all comments should be published, not just the new ones! - AttachedPostComments { - /// The Hash of the Block for the Post which the comments are for - #[serde(rename = "comments-for")] - comments_for: IPFSHash, - - /// Hashes of direct answers to the post pointed to by "comments_for" - /// This list always represents a full list of all answers. As comments are added, old - /// versions of this object should be ignored by clients if newer variants for the same `comments_for`-object are published. - #[serde(rename = "refs")] - #[serde(default)] - refs: Vec<IPFSHash>, - }, - - /// A variant describing a profile - /// - /// A profile contains the whole set of data which is considered "current" for the - /// profile. Older versions of this shall then be ignored by clients. - Profile { - - /// The self-assigned names of a user. - #[serde(rename = "names")] - names: Vec<String>, - - /// An optional user profile picture - /// - /// The picture itself is located behind a IPFS hash. If the hash does not resolve to a - /// picture, clients should ignore it. - /// - /// A profile may only contain _one_ profile picture in the current version of the - /// protocol. - #[serde(rename = "picture")] - #[serde(default)] - picture: Option<IPFSHash>, - - /// A "more" field where arbitrary data can be stored. Like "Biography", "Hobbies", - /// "Political opinion" or even pictures, ... - /// - /// The stored data can be of any type. - #[serde(rename = "user-defined")] - #[serde(default)] - more: BTreeMap<String, Userdata>, - }, -} - -impl Payload { - /// Helper function - pub fn is_none(&self) -> bool { - match self { - &Payload::None => true, - _ => false, - } - } - - /// Helper function - pub fn is_post(&self) -> bool { - match self { - &Payload::Post {..} => true, - _ => false, - } - } - - /// Helper function - pub fn is_attached_post_comments(&self) -> bool { - match self { - &Payload::AttachedPostComments {..} => true, - _ => false, - } - } - - /// Helper function - pub fn is_profile(&self) -> bool { - match self { - &Payload::Profile {..} => true, - _ => false, - } - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Userdata { - #[serde(rename = "mimetype")] - mimetype: MimeType, - - #[serde(rename = "data")] - data: IPFSHash, -} - |