From c37ceaf1c3e4371f320798bf423719a9a6fe71fd Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 1 Nov 2023 00:00:00 +0000 Subject: refactor(claim) add RepoRef struct enable wider usage of repoistory reference details --- src/sub_commands/repo_ref.rs | 137 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/sub_commands/repo_ref.rs (limited to 'src/sub_commands/repo_ref.rs') diff --git a/src/sub_commands/repo_ref.rs b/src/sub_commands/repo_ref.rs new file mode 100644 index 0000000..82580df --- /dev/null +++ b/src/sub_commands/repo_ref.rs @@ -0,0 +1,137 @@ +use anyhow::{Context, Result}; +use nostr::Tag; + +#[derive(Default)] +pub struct RepoRef { + name: String, + description: String, + root_commit: String, + relays: Vec, + // git_server: String, + // other maintainers + // code languages and hashtags +} + +impl RepoRef { + pub fn set_name(&mut self, name: String) -> &mut Self { + self.name = name; + self + } + + pub fn set_description(&mut self, description: String) -> &mut Self { + self.description = description; + self + } + + pub fn set_root_commit(&mut self, root_commit: String) -> &mut Self { + self.root_commit = root_commit; + self + } + + pub fn set_relays(&mut self, relays: Vec) -> &mut Self { + self.relays = relays; + self + } + + pub fn to_event(&self, keys: &nostr::Keys) -> Result { + nostr_sdk::EventBuilder::new( + nostr::event::Kind::Custom(30017), + "", + &[ + vec![ + Tag::Identifier(self.root_commit.to_string()), + Tag::Reference(format!("r-{}", self.root_commit)), + Tag::Name(self.name.clone()), + Tag::Description(self.description.clone()), + ], + self.relays.iter().map(|r| Tag::Relay(r.into())).collect(), + // git_servers + // other maintainers + // code languages and hashtags + ] + .concat(), + ) + .to_event(keys) + .context("failed to create repository reference event") + } +} + +#[cfg(test)] +mod tests { + use test_utils::*; + + use super::*; + + mod to_event { + use super::*; + mod tags { + use super::*; + fn create() -> nostr::Event { + RepoRef::default() + .set_name("test name".to_string()) + .set_description("test description".to_string()) + .set_root_commit("23471389461".to_string()) + .set_relays(vec![ + "ws://relay1.io".to_string(), + "ws://relay2.io".to_string(), + ]) + .to_event(&TEST_KEY_1_KEYS) + .unwrap() + } + + #[test] + fn name() { + assert!( + create() + .tags + .iter() + .any(|t| t.as_vec()[0].eq("name") && t.as_vec()[1].eq("test name")) + ) + } + #[test] + fn description() { + assert!(create().tags.iter().any( + |t| t.as_vec()[0].eq("description") && t.as_vec()[1].eq("test description") + )) + } + + #[test] + fn root_commit_as_d_replaceable_event_identifier() { + assert!( + create() + .tags + .iter() + .any(|t| t.as_vec()[0].eq("d") && t.as_vec()[1].eq("23471389461")) + ) + } + + #[test] + fn root_commit_as_reference() { + assert!( + create() + .tags + .iter() + .any(|t| t.as_vec()[0].eq("r") && t.as_vec()[1].eq("r-23471389461")) + ) + } + + #[test] + fn relays() { + let event = create(); + let relay_tags = event + .tags + .iter() + .filter(|t| t.as_vec()[0].eq("relay")) + .collect::>(); + assert_eq!(relay_tags[0].as_vec().len(), 2); + assert_eq!(relay_tags[0].as_vec()[1], "ws://relay1.io"); + assert_eq!(relay_tags[1].as_vec()[1], "ws://relay2.io"); + } + + #[test] + fn no_other_tags() { + assert_eq!(create().tags.len(), 6) + } + } + } +} -- cgit v1.2.3