aboutsummaryrefslogtreecommitdiffstats
path: root/src/stream
diff options
context:
space:
mode:
Diffstat (limited to 'src/stream')
-rw-r--r--src/stream/streamitem.rs46
-rw-r--r--src/stream/verb.rs80
2 files changed, 126 insertions, 0 deletions
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 <haraldei@anduin.net>
+ *
+ * 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 <haraldei@anduin.net>
+ *
+ * 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<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")))
+ }
+ }
+}
+
+
+#[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);
+ }
+
+ }
+}