From 316c62b8ddce3315cca0a9ecf35c551e8013160e Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Fri, 12 Jan 2024 18:59:05 +0100 Subject: Refactor stream API, move StreamItem and Verb to modules. --- src/stream.rs | 106 +++++------------------------------------------ src/stream/streamitem.rs | 46 ++++++++++++++++++++ src/stream/verb.rs | 80 +++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 96 deletions(-) create mode 100644 src/stream/streamitem.rs create mode 100644 src/stream/verb.rs diff --git a/src/stream.rs b/src/stream.rs index 475c886..8f543cc 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -11,7 +11,16 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -use serde::Deserialize; +mod streamitem; +mod verb; + +pub use streamitem::{ + StreamItem, + StreamItemEncoding, + StreamItemType, +}; +pub use verb::Verb; + use std::{ error::Error, result::Result @@ -22,79 +31,6 @@ pub struct Stream { pub items: Vec, } -#[derive(Debug, Deserialize, PartialEq)] -enum StreamItemType { - #[serde(rename="activity")] - Activity, -} - -#[derive(Debug, Deserialize, PartialEq)] -enum StreamItemEncoding { - #[serde(rename="zot")] - Zot, -} - -#[derive(Debug, PartialEq)] -enum Verb { - Post, - Like, - Update, -} - -impl<'de> Deserialize<'de> for Verb { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - deserializer.deserialize_str(VerbVisitor) - } -} - -struct VerbVisitor; - -impl<'de> serde::de::Visitor<'de> for VerbVisitor { - type Value = Verb; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(formatter, "a valid activity streams verb URI") - } - - fn visit_str(self, s: &str) -> Result - where - E: serde::de::Error, - { - match s { - "http://activitystrea.ms/schema/1.0/post" => - Ok(Verb::Post), - "http://activitystrea.ms/schema/1.0/like" => - Ok(Verb::Like), - "http://activitystrea.ms/schema/1.0/update" => - Ok(Verb::Update), - _ => - Err(E::custom(format!("unknown activity streams verb"))) - } - } -} - -#[derive(Debug, Deserialize, PartialEq)] -pub struct StreamItem { - #[serde(rename="type")] - item_type: StreamItemType, - encoding: StreamItemEncoding, - - verb: Verb, - - pub title: String, - pub summary: String, - pub body: String, -} - -impl StreamItem { - pub fn is_post(&self) -> bool { - self.verb == Verb::Post - } -} - impl Stream { pub fn from_json(json: &str) -> Result> { let items: Vec = serde_json::from_str(&json)?; @@ -206,26 +142,4 @@ mod test { assert_eq!("The summary of the post", &item.summary); assert_eq!("The body of the post", &item.body); } - - #[test] - fn deserialize_activitustreams_verb_from_json() { - #[derive(Debug, Deserialize, PartialEq)] - struct VerbTest { - verb: Verb - } - - let verbs = vec![ - (Verb::Post, "post"), - (Verb::Like, "like"), - (Verb::Update, "update") - ]; - - for v in verbs { - let verb: VerbTest = serde_json::from_str( - &format!(r#"{{"verb": "http://activitystrea.ms/schema/1.0/{}"}}"#, v.1) - ).unwrap(); - assert_eq!(v.0, verb.verb); - } - - } } diff --git a/src/stream/streamitem.rs b/src/stream/streamitem.rs new file mode 100644 index 0000000..343ed28 --- /dev/null +++ b/src/stream/streamitem.rs @@ -0,0 +1,46 @@ +/** + * Representation of a stream item, as received from the zot api streams. + * + * SPDX-FileCopyrightText: 2023 Eilertsens Kodeknekkeri + * SPDX-FileCopyrightText: 2023 Harald Eilertsen + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +use super::verb::Verb; + +use serde::Deserialize; + +#[derive(Debug, Deserialize, PartialEq)] +pub enum StreamItemType { + #[serde(rename="activity")] + Activity, +} + +#[derive(Debug, Deserialize, PartialEq)] +pub enum StreamItemEncoding { + #[serde(rename="zot")] + Zot, +} + +/** + * Represents an item as returned by the stream API's. + */ +#[derive(Debug, Deserialize, PartialEq)] +pub struct StreamItem { + #[serde(rename="type")] + pub item_type: StreamItemType, + pub encoding: StreamItemEncoding, + + pub verb: Verb, + + pub title: String, + pub summary: String, + pub body: String, +} + +impl StreamItem { + pub fn is_post(&self) -> bool { + self.verb == Verb::Post + } +} diff --git a/src/stream/verb.rs b/src/stream/verb.rs new file mode 100644 index 0000000..75a8dac --- /dev/null +++ b/src/stream/verb.rs @@ -0,0 +1,80 @@ +/** + * Code to represent an activitystreams verb. + * + * SPDX-FileCopyrightText: 2023 Eilertsens Kodeknekkeri + * SPDX-FileCopyrightText: 2023 Harald Eilertsen + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +use serde::Deserialize; + +#[derive(Debug, PartialEq)] +pub enum Verb { + Post, + Like, + Update, +} + +impl<'de> Deserialize<'de> for Verb { + fn deserialize(deserializer: D) -> Result + where + D: serde::de::Deserializer<'de>, + { + deserializer.deserialize_str(VerbVisitor) + } +} + +struct VerbVisitor; + +impl<'de> serde::de::Visitor<'de> for VerbVisitor { + type Value = Verb; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "a valid activity streams verb URI") + } + + fn visit_str(self, s: &str) -> Result + where + E: serde::de::Error, + { + match s { + "http://activitystrea.ms/schema/1.0/post" => + Ok(Verb::Post), + "http://activitystrea.ms/schema/1.0/like" => + Ok(Verb::Like), + "http://activitystrea.ms/schema/1.0/update" => + Ok(Verb::Update), + _ => + Err(E::custom(format!("unknown activity streams verb"))) + } + } +} + + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn deserialize_activitustreams_verb_from_json() { + #[derive(Debug, Deserialize, PartialEq)] + struct VerbTest { + verb: Verb + } + + let verbs = vec![ + (Verb::Post, "post"), + (Verb::Like, "like"), + (Verb::Update, "update") + ]; + + for v in verbs { + let verb: VerbTest = serde_json::from_str( + &format!(r#"{{"verb": "http://activitystrea.ms/schema/1.0/{}"}}"#, v.1) + ).unwrap(); + assert_eq!(v.0, verb.verb); + } + + } +} -- cgit v1.2.3