aboutsummaryrefslogtreecommitdiffstats
path: root/src/stream.rs
diff options
context:
space:
mode:
authorHarald Eilertsen <haraldei@anduin.net>2024-01-12 18:59:05 +0100
committerHarald Eilertsen <haraldei@anduin.net>2024-01-12 18:59:05 +0100
commit316c62b8ddce3315cca0a9ecf35c551e8013160e (patch)
tree2a14ab0ecf8ef18c9fdc52ca9acdade298d1b88b /src/stream.rs
parentbe04fb276aa4777f5477c579fc82f1cef9b18d65 (diff)
downloadrust-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.rs106
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);
- }
-
- }
}