From 04b1504e8715ee6acf498a4261775f3b9d6d6daa Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Sat, 13 Jan 2024 20:35:13 +0100 Subject: Add stream Actor and Tag structs and complete StreamItem. --- src/stream.rs | 7 +++++++ src/stream/actor.rs | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ src/stream/streamitem.rs | 16 +++++++++++++++ src/stream/tag.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 src/stream/actor.rs create mode 100644 src/stream/tag.rs diff --git a/src/stream.rs b/src/stream.rs index 0348822..c717a17 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -11,16 +11,23 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +mod actor; mod datetime; mod streamitem; +mod tag; mod verb; +pub use actor::Actor; pub use datetime::DateTime; pub use streamitem::{ StreamItem, StreamItemEncoding, StreamItemType, }; +pub use tag::{ + Tag, + TagType, +}; pub use verb::Verb; use std::{ diff --git a/src/stream/actor.rs b/src/stream/actor.rs new file mode 100644 index 0000000..88090cf --- /dev/null +++ b/src/stream/actor.rs @@ -0,0 +1,51 @@ +/** + * Representation of Actors in the activitystream. + * + * SPDX-FileCopyrightText: 2023 Eilertsens Kodeknekkeri + * SPDX-FileCopyrightText: 2023 Harald Eilertsen + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +use serde::Deserialize; +use url::Url; + +#[derive(Debug, Deserialize, PartialEq)] +pub struct Actor { + name: String, + address: String, + url: Url, + id: String, + id_sig: String, + key: String, +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_parsing_actor_from_json() { + let json = r#" + { + "name": "Benjamin Franklin", + "address": "ben@example.com", + "url": "https://example.com/channel/ben", + "network": "zot6", + "photo": { + "mimetype": "image/jpeg", + "src": "https://example.com/photo/profile/m/2" + }, + "id": "rUpgk2qbvnWLoKIXOlZlwlqI5vk8C4NgudFNjbcmnOBjFSXU34TObkZEClaPSfKnpFZpg87tANtko7WGs7QRvA", + "id_sig": "sha256.ZD8uwYmUEG_d02Y...", + "key": "-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----\n" + }"#; + + let actor: Actor = serde_json::from_str(&json).unwrap(); + + assert_eq!("Benjamin Franklin", actor.name); + assert_eq!("ben@example.com", actor.address); + assert_eq!("https://example.com/channel/ben", actor.url.to_string()); + assert_eq!("rUpgk2qbvnWLoKIXOlZlwlqI5vk8C4NgudFNjbcmnOBjFSXU34TObkZEClaPSfKnpFZpg87tANtko7WGs7QRvA", actor.id); + } +} diff --git a/src/stream/streamitem.rs b/src/stream/streamitem.rs index d30be9e..3040dea 100644 --- a/src/stream/streamitem.rs +++ b/src/stream/streamitem.rs @@ -7,7 +7,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +use super::actor::Actor; use super::datetime::DateTime; +use super::Tag; use super::verb::Verb; use serde::Deserialize; @@ -26,6 +28,12 @@ pub enum StreamItemEncoding { Zot, } +#[derive(Debug, Deserialize, PartialEq)] +pub enum StreamItemFlag { + #[serde(rename="thread_parent")] + ThreadParent, +} + /** * Represents an item as returned by the stream API's. */ @@ -56,6 +64,13 @@ pub struct StreamItem { pub title: String, pub summary: String, pub body: String, + + pub owner: Actor, + pub author: Actor, + + pub signature: String, + pub flags: Vec, + pub tags: Vec, } impl StreamItem { @@ -163,5 +178,6 @@ mod test { assert_eq!("2023-12-12 17:00:42", &item.edited.to_string()); assert_eq!("0000-00-00 00:00:00", &item.expires.to_string()); assert_eq!("2023-12-19 09:01:15", &item.commented.to_string()); + assert_eq!(StreamItemFlag::ThreadParent, item.flags[0]); } } diff --git a/src/stream/tag.rs b/src/stream/tag.rs new file mode 100644 index 0000000..0d2ee23 --- /dev/null +++ b/src/stream/tag.rs @@ -0,0 +1,47 @@ +/** + * Representation of a Tag + * + * SPDX-FileCopyrightText: 2023 Eilertsens Kodeknekkeri + * SPDX-FileCopyrightText: 2023 Harald Eilertsen + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +use serde::Deserialize; +use url::Url; + +#[derive(Debug, Deserialize, PartialEq)] +pub enum TagType { + #[serde(rename = "hashtag")] + Hashtag, +} + +#[derive(Debug, Deserialize, PartialEq)] +pub struct Tag { + tag: String, + url: Url, + + #[serde(rename = "type")] + tag_type: TagType, +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_parsing_tag_from_json() { + let json = r#" + { + "tag": "hubzilla", + "url": "https://example.com/search?tag=hubzilla", + "type": "hashtag" + } + "#; + + let tag: Tag = serde_json::from_str(json).unwrap(); + assert_eq!("hubzilla", tag.tag); + assert_eq!("https://example.com/search?tag=hubzilla", tag.url.to_string()); + assert_eq!(TagType::Hashtag, tag.tag_type); + } +} -- cgit v1.2.3