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/claim.rs | 49 ++++------------ src/sub_commands/mod.rs | 1 + src/sub_commands/repo_ref.rs | 137 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 38 deletions(-) create mode 100644 src/sub_commands/repo_ref.rs (limited to 'src') diff --git a/src/sub_commands/claim.rs b/src/sub_commands/claim.rs index 5eb66bb..cb6e99d 100644 --- a/src/sub_commands/claim.rs +++ b/src/sub_commands/claim.rs @@ -1,5 +1,4 @@ use anyhow::{Context, Result}; -use nostr::{EventBuilder, Tag}; use super::prs::create::send_events; #[cfg(not(test))] @@ -10,7 +9,9 @@ use crate::{ cli_interactor::{Interactor, InteractorPrompt, PromptInputParms}, client::Connect, git::{Repo, RepoActions}, - login, Cli, + login, + sub_commands::repo_ref::RepoRef, + Cli, }; #[derive(Debug, clap::Args)] @@ -66,15 +67,16 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> { println!("publishing repostory reference..."); + let repo_event = RepoRef::default() + .set_name(name) + .set_description(description) + .set_root_commit(root_commit.to_string()) + .set_relays(repo_relays.clone()) + .to_event(&keys)?; + send_events( &client, - vec![generate_repo_event( - &name, - &description, - &repo_relays, - &root_commit.to_string(), - &keys, - )?], + vec![repo_event], user_ref.relays.write(), repo_relays, !cli_args.disable_cli_spinners, @@ -83,32 +85,3 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> { Ok(()) } - -fn generate_repo_event( - name: &str, - description: &str, - relays: &[String], - // git_server: String, - root_commit: &String, - keys: &nostr::Keys, -) -> Result { - EventBuilder::new( - nostr::event::Kind::Custom(30017), - "", - &[ - vec![ - Tag::Identifier(root_commit.to_string()), - Tag::Reference(format!("r-{root_commit}")), - Tag::Name(name.to_owned()), - Tag::Description(description.to_owned()), - ], - 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 pr event") -} diff --git a/src/sub_commands/mod.rs b/src/sub_commands/mod.rs index 6e99ca5..9e9f602 100644 --- a/src/sub_commands/mod.rs +++ b/src/sub_commands/mod.rs @@ -1,3 +1,4 @@ pub mod claim; pub mod login; pub mod prs; +pub mod repo_ref; 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