diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2024-01-12 18:59:05 +0100 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2024-01-12 18:59:05 +0100 |
commit | 316c62b8ddce3315cca0a9ecf35c551e8013160e (patch) | |
tree | 2a14ab0ecf8ef18c9fdc52ca9acdade298d1b88b /src/stream.rs | |
parent | be04fb276aa4777f5477c579fc82f1cef9b18d65 (diff) | |
download | rust-zotapi-316c62b8ddce3315cca0a9ecf35c551e8013160e.tar.gz rust-zotapi-316c62b8ddce3315cca0a9ecf35c551e8013160e.tar.bz2 rust-zotapi-316c62b8ddce3315cca0a9ecf35c551e8013160e.zip |
Refactor stream API, move StreamItem and Verb to modules.
Diffstat (limited to 'src/stream.rs')
-rw-r--r-- | src/stream.rs | 106 |
1 files changed, 10 insertions, 96 deletions
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<StreamItem>, } -#[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<D>(deserializer: D) -> Result<Verb, D::Error> - 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<E>(self, s: &str) -> Result<Self::Value, E> - 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<Self, Box<dyn Error + 'static>> { let items: Vec<StreamItem> = 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); - } - - } } |