From 83448a99aaf18c7a045a081c5de0c22bc4a83de1 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 27 Nov 2024 17:08:25 +0000 Subject: chore: bump rust-nosrt v0.37.0 use RelayUrl in repo_ref which I had resisted as it mutates relay urls when printed to append a slash --- src/bin/git_remote_nostr/push.rs | 15 ++++---- src/bin/ngit/sub_commands/init.rs | 63 +++++++++++++++++++++++---------- src/bin/ngit/sub_commands/send.rs | 3 +- src/lib/client.rs | 73 +++++++++++++++++++-------------------- src/lib/git/nostr_url.rs | 31 +++++++++-------- src/lib/git_events.rs | 19 +++++++--- src/lib/login/fresh.rs | 12 +++---- src/lib/repo_ref.rs | 29 ++++++++++------ 8 files changed, 143 insertions(+), 102 deletions(-) (limited to 'src') diff --git a/src/bin/git_remote_nostr/push.rs b/src/bin/git_remote_nostr/push.rs index 381a45e..d8ba65a 100644 --- a/src/bin/git_remote_nostr/push.rs +++ b/src/bin/git_remote_nostr/push.rs @@ -961,9 +961,7 @@ async fn create_merge_status( public_keys.insert(revision.pubkey); } sign_event( - EventBuilder::new( - nostr::event::Kind::GitStatusApplied, - String::new(), + EventBuilder::new(nostr::event::Kind::GitStatusApplied, String::new()).tags( [ vec![ Tag::custom( @@ -972,23 +970,26 @@ async fn create_merge_status( ), Tag::from_standardized(nostr::TagStandard::Event { event_id: proposal.id, - relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new), + relay_url: repo_ref.relays.first().cloned(), marker: Some(Marker::Root), public_key: None, + uppercase: false, }), Tag::from_standardized(nostr::TagStandard::Event { event_id: merged_patch, - relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new), + relay_url: repo_ref.relays.first().cloned(), marker: Some(Marker::Mention), public_key: None, + uppercase: false, }), ], if let Some(revision) = revision { vec![Tag::from_standardized(nostr::TagStandard::Event { event_id: revision.id, - relay_url: repo_ref.relays.first().map(nostr::UncheckedUrl::new), + relay_url: repo_ref.relays.first().cloned(), marker: Some(Marker::Root), public_key: None, + uppercase: false, })] } else { vec![] @@ -1202,7 +1203,7 @@ impl BuildRepoState for RepoState { vec![value.clone()], )); } - let event = sign_event(EventBuilder::new(STATE_KIND, "", tags), signer).await?; + let event = sign_event(EventBuilder::new(STATE_KIND, "").tags(tags), signer).await?; Ok(RepoState { identifier, state, diff --git a/src/bin/ngit/sub_commands/init.rs b/src/bin/ngit/sub_commands/init.rs index 2af6aef..0d3e344 100644 --- a/src/bin/ngit/sub_commands/init.rs +++ b/src/bin/ngit/sub_commands/init.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use anyhow::{Context, Result}; use ngit::cli_interactor::PromptConfirmParms; use nostr::{nips::nip01::Coordinate, FromBech32, PublicKey, ToBech32}; -use nostr_sdk::Kind; +use nostr_sdk::{Kind, RelayUrl}; use crate::{ cli::{extract_signer_cli_arguments, Cli}, @@ -323,24 +323,45 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> { // TODO: check if relays are free to post to so contributors can submit patches // TODO: recommend some reliable free ones - let relays: Vec = if args.relays.is_empty() { - Interactor::default() - .input( - PromptInputParms::default() - .with_prompt("relays") - .with_default(if let Ok(config) = &repo_config_result { - config.relays.clone().join(" ") - } else if let Some(repo_ref) = &repo_ref { - repo_ref.relays.clone().join(" ") - } else { - user_ref.relays.write().join(" ") - }), - )? - .split(' ') - .map(std::string::ToString::to_string) - .collect() - } else { - args.relays.clone() + let relays: Vec = { + let mut default = if let Ok(config) = &repo_config_result { + config.relays.clone().join(" ") + } else if let Some(repo_ref) = &repo_ref { + repo_ref + .relays + .iter() + .map(std::string::ToString::to_string) + .collect::>() + .join(" ") + } else { + user_ref.relays.write().join(" ") + }; + 'outer: loop { + let relays: Vec = if args.relays.is_empty() { + Interactor::default() + .input( + PromptInputParms::default() + .with_prompt("relays") + .with_default(default), + )? + .split(' ') + .map(std::string::ToString::to_string) + .collect() + } else { + args.relays.clone() + }; + let mut relay_urls = vec![]; + for r in &relays { + if let Ok(r) = RelayUrl::parse(r) { + relay_urls.push(r); + } else { + eprintln!("{r} is not a valid relay url"); + default = relays.join(" "); + continue 'outer; + } + } + break relay_urls; + } }; let earliest_unique_commit = match &args.earliest_unique_commit { @@ -415,6 +436,10 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> { false, )?; + let relays = relays + .iter() + .map(std::string::ToString::to_string) + .collect::>(); // if yaml file doesnt exist or needs updating if match &repo_config_result { Ok(config) => { diff --git a/src/bin/ngit/sub_commands/send.rs b/src/bin/ngit/sub_commands/send.rs index 1965875..6c9d8eb 100644 --- a/src/bin/ngit/sub_commands/send.rs +++ b/src/bin/ngit/sub_commands/send.rs @@ -237,7 +237,7 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs, no_fetch: bool) -> Re if root_proposal_id.is_none() { if let Some(event) = events.first() { let event_bech32 = if let Some(relay) = repo_ref.relays.first() { - Nip19Event::new(event.id, vec![relay]).to_bech32()? + Nip19Event::new(event.id, vec![relay.to_string()]).to_bech32()? } else { event.id.to_bech32()? }; @@ -366,6 +366,7 @@ async fn get_root_proposal_id_and_mentions_from_in_reply_to( relay_url: _, marker: _, public_key: _, + uppercase: false, }) => { let events = get_events_from_local_cache( git_repo_path, diff --git a/src/lib/client.rs b/src/lib/client.rs index 7093dd5..051aa3d 100644 --- a/src/lib/client.rs +++ b/src/lib/client.rs @@ -30,11 +30,11 @@ use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressState, P #[cfg(test)] use mockall::*; use nostr::{nips::nip01::Coordinate, Event}; -use nostr_database::NostrDatabase; +use nostr_database::NostrEventsDatabase; use nostr_lmdb::NostrLMDB; use nostr_sdk::{ - prelude::RelayLimits, EventBuilder, EventId, Kind, NostrSigner, Options, PublicKey, - SingleLetterTag, Timestamp, Url, + prelude::RelayLimits, EventBuilder, EventId, Kind, NostrSigner, Options, PublicKey, RelayUrl, + SingleLetterTag, Timestamp, }; use crate::{ @@ -63,7 +63,7 @@ pub trait Connect { fn default() -> Self; fn new(opts: Params) -> Self; async fn set_signer(&mut self, signer: Arc); - async fn connect(&self, relay_url: &Url) -> Result<()>; + async fn connect(&self, relay_url: &RelayUrl) -> Result<()>; async fn disconnect(&self) -> Result<()>; fn get_fallback_relays(&self) -> &Vec; fn get_more_fallback_relays(&self) -> &Vec; @@ -82,7 +82,7 @@ pub trait Connect { ) -> Result>; async fn get_events_per_relay( &self, - relays: Vec, + relays: Vec, filters: Vec, progress_reporter: MultiProgress, ) -> Result<(Vec>>, MultiProgress)>; @@ -172,7 +172,7 @@ impl Connect for Client { self.client.set_signer(signer).await; } - async fn connect(&self, relay_url: &Url) -> Result<()> { + async fn connect(&self, relay_url: &RelayUrl) -> Result<()> { self.client .add_relay(relay_url) .await @@ -244,7 +244,7 @@ impl Connect for Client { ) -> Result> { let (relay_results, _) = self .get_events_per_relay( - relays.iter().map(|r| Url::parse(r).unwrap()).collect(), + relays.iter().map(|r| RelayUrl::parse(r).unwrap()).collect(), filters, MultiProgress::new(), ) @@ -254,7 +254,7 @@ impl Connect for Client { async fn get_events_per_relay( &self, - relays: Vec, + relays: Vec, filters: Vec, progress_reporter: MultiProgress, ) -> Result<(Vec>>, MultiProgress)> { @@ -335,8 +335,8 @@ impl Connect for Client { let fallback_relays = &self .fallback_relays .iter() - .filter_map(|r| Url::parse(r).ok()) - .collect::>(); + .filter_map(|r| RelayUrl::parse(r).ok()) + .collect::>(); let mut request = create_relays_request( git_repo_path, @@ -359,17 +359,17 @@ impl Connect for Client { // don't look for events on blaster .filter(|&r| !r.as_str().contains("nostr.mutinywallet.com")) .cloned() - .collect::>() + .collect::>() .difference(&processed_relays) .cloned() - .collect::>(); + .collect::>(); if relays.is_empty() { break; } let profile_relays_only = request .user_relays_for_profiles .difference(&request.repo_relays) - .collect::>(); + .collect::>(); for relay in &request.repo_relays { self.client .add_relay(relay.as_str()) @@ -469,11 +469,7 @@ impl Connect for Client { processed_relays.extend(relays.clone()); if let Ok(repo_ref) = get_repo_ref_from_cache(git_repo_path, repo_coordinates).await { - request.repo_relays = repo_ref - .relays - .iter() - .filter_map(|r| Url::parse(r).ok()) - .collect(); + request.repo_relays = repo_ref.relays.iter().cloned().collect(); } request.user_relays_for_profiles = { @@ -486,7 +482,7 @@ impl Connect for Client { { if let Ok(user_ref) = get_user_ref_from_cache(git_repo_path, user).await { for r in user_ref.relays.write() { - if let Ok(url) = Url::parse(&r) { + if let Ok(url) = RelayUrl::parse(&r) { set.insert(url); } } @@ -905,7 +901,7 @@ async fn create_relays_request( git_repo_path: Option<&Path>, repo_coordinates: &HashSet, user_profiles: &HashSet, - fallback_relays: HashSet, + fallback_relays: HashSet, ) -> Result { let repo_ref = get_repo_ref_from_cache(git_repo_path, repo_coordinates).await; @@ -1026,7 +1022,7 @@ async fn create_relays_request( { if let Ok(user_ref) = get_user_ref_from_cache(git_repo_path, user).await { for r in user_ref.relays.write() { - if let Ok(url) = Url::parse(&r) { + if let Ok(url) = RelayUrl::parse(&r) { set.insert(url); } } @@ -1068,17 +1064,13 @@ async fn create_relays_request( let relays = { let mut relays = fallback_relays; if let Ok(repo_ref) = &repo_ref { - for r in &repo_ref.relays { - if let Ok(url) = Url::parse(r) { - relays.insert(url); - } + for r in repo_ref.relays.clone() { + relays.insert(r); } } for c in repo_coordinates { for r in &c.relays { - if let Ok(url) = Url::parse(r) { - relays.insert(url); - } + relays.insert(r.clone()); } } relays @@ -1500,8 +1492,8 @@ impl Display for FetchReport { #[derive(Default, Clone)] pub struct FetchRequest { - repo_relays: HashSet, - selected_relay: Option, + repo_relays: HashSet, + selected_relay: Option, relay_column_width: usize, repo_coordinates_without_relays: Vec<(Coordinate, Option)>, state: Option<(Timestamp, EventId)>, @@ -1510,7 +1502,7 @@ pub struct FetchRequest { missing_contributor_profiles: HashSet, existing_events: HashSet, profiles_to_fetch_from_user_relays: HashMap, - user_relays_for_profiles: HashSet, + user_relays_for_profiles: HashSet, } pub async fn fetching_with_report( @@ -1646,7 +1638,7 @@ pub async fn send_events( git_repo_path: Option<&Path>, events: Vec, my_write_relays: Vec, - repo_read_relays: Vec, + repo_read_relays: Vec, animate: bool, silent: bool, ) -> Result<()> { @@ -1659,7 +1651,12 @@ pub async fn send_events( }, ] .concat(); - let mut relays: Vec<&String> = vec![]; + let mut relays: Vec<&str> = vec![]; + + let repo_read_relays = repo_read_relays + .iter() + .map(|r| r.to_string()) + .collect::>(); let all = &[ repo_read_relays.clone(), @@ -1722,7 +1719,7 @@ pub async fn send_events( #[allow(clippy::borrow_deref_ref)] join_all(relays.iter().map(|&relay| async { - let relay_clean = remove_trailing_slash(&*relay); + let relay_clean = remove_trailing_slash(relay); let details = format!( "{}{}{} {}", if my_write_relays @@ -1735,7 +1732,7 @@ pub async fn send_events( }, if repo_read_relays .iter() - .any(|r| relay_clean.eq(&remove_trailing_slash(r))) + .any(|r| relay_clean.eq(&remove_trailing_slash(&r.to_string()))) { " [repo-relay]" } else { @@ -1763,7 +1760,7 @@ pub async fn send_events( let mut failed = false; for event in &events { match client - .send_event_to(git_repo_path, relay.as_str(), event.clone()) + .send_event_to(git_repo_path, relay, event.clone()) .await { Ok(_) => pb.inc(1), @@ -1793,8 +1790,8 @@ pub async fn send_events( Ok(()) } -fn remove_trailing_slash(s: &String) -> String { - match s.as_str().strip_suffix('/') { +fn remove_trailing_slash(s: &str) -> String { + match s.strip_suffix('/') { Some(s) => s, None => s, } diff --git a/src/lib/git/nostr_url.rs b/src/lib/git/nostr_url.rs index b310782..e4b6825 100644 --- a/src/lib/git/nostr_url.rs +++ b/src/lib/git/nostr_url.rs @@ -3,7 +3,7 @@ use std::{collections::HashSet, str::FromStr}; use anyhow::{anyhow, bail, Context, Error, Result}; use nostr::nips::nip01::Coordinate; -use nostr_sdk::{PublicKey, Url}; +use nostr_sdk::{PublicKey, RelayUrl, Url}; #[derive(Debug, PartialEq, Default, Clone)] pub enum ServerProtocol { @@ -85,8 +85,8 @@ impl std::str::FromStr for NostrUrlDecoded { decoded = format!("wss://{decoded}"); } let url = - Url::parse(&decoded).context("could not parse relays in nostr git url")?; - relays.push(url.to_string()); + RelayUrl::parse(&decoded).context("could not parse relays in nostr git url")?; + relays.push(url); } else if name == "protocol" { protocol = match value.as_ref() { "ssh" => Some(ServerProtocol::Ssh), @@ -151,8 +151,8 @@ impl std::str::FromStr for NostrUrlDecoded { decoded = format!("wss://{decoded}"); } let url = - Url::parse(&decoded).context("could not parse relays in nostr git url")?; - relays.push(url.to_string()); + RelayUrl::parse(&decoded).context("could not parse relays in nostr git url")?; + relays.push(url); } coordinates.insert(Coordinate { identifier, @@ -852,7 +852,7 @@ mod tests { .unwrap(), kind: nostr_sdk::Kind::GitRepoAnnouncement, relays: if relays { - vec!["wss://nos.lol/".to_string()] + vec![RelayUrl::parse("wss://nos.lol").unwrap()] } else { vec![] }, @@ -873,7 +873,8 @@ mod tests { ) .unwrap(), kind: nostr_sdk::Kind::GitRepoAnnouncement, - relays: vec!["wss://nos.lol".to_string()], // wont add the slash + relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], /* wont add the + * slash */ }]), protocol: None, user: None, @@ -942,8 +943,8 @@ mod tests { fn with_multiple_encoded_relays() -> Result<()> { let url = format!( "nostr://npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit?relay={}&relay1={}", - urlencoding::encode("wss://nos.lol"), - urlencoding::encode("wss://relay.damus.io"), + urlencoding::encode("wss://nos.lol/"), + urlencoding::encode("wss://relay.damus.io/"), ); assert_eq!( NostrUrlDecoded::from_str(&url)?, @@ -957,8 +958,8 @@ mod tests { .unwrap(), kind: nostr_sdk::Kind::GitRepoAnnouncement, relays: vec![ - "wss://nos.lol/".to_string(), - "wss://relay.damus.io/".to_string(), + RelayUrl::parse("wss://nos.lol/").unwrap(), + RelayUrl::parse("wss://relay.damus.io/").unwrap(), ], }]), protocol: None, @@ -1039,8 +1040,8 @@ mod tests { fn with_multiple_encoded_relays() -> Result<()> { let url = format!( "nostr://npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/{}/{}/ngit", - urlencoding::encode("wss://nos.lol"), - urlencoding::encode("wss://relay.damus.io"), + urlencoding::encode("wss://nos.lol/"), + urlencoding::encode("wss://relay.damus.io/"), ); assert_eq!( NostrUrlDecoded::from_str(&url)?, @@ -1054,8 +1055,8 @@ mod tests { .unwrap(), kind: nostr_sdk::Kind::GitRepoAnnouncement, relays: vec![ - "wss://nos.lol/".to_string(), - "wss://relay.damus.io/".to_string(), + RelayUrl::parse("wss://nos.lol/").unwrap(), + RelayUrl::parse("wss://relay.damus.io/").unwrap(), ], }]), protocol: None, diff --git a/src/lib/git_events.rs b/src/lib/git_events.rs index bfe5b30..c4d6770 100644 --- a/src/lib/git_events.rs +++ b/src/lib/git_events.rs @@ -4,7 +4,7 @@ use anyhow::{bail, Context, Result}; use nostr::nips::{nip01::Coordinate, nip10::Marker, nip19::Nip19}; use nostr_sdk::{ hashes::sha1::Hash as Sha1Hash, Event, EventBuilder, EventId, FromBech32, Kind, NostrSigner, - PublicKey, Tag, TagKind, TagStandard, UncheckedUrl, + PublicKey, RelayUrl, Tag, TagKind, TagStandard, }; use crate::{ @@ -96,7 +96,7 @@ pub async fn generate_patch_event( let commit_parent = git_repo .get_commit_parent(commit) .context("failed to get parent commit")?; - let relay_hint = repo_ref.relays.first().map(nostr::UncheckedUrl::from); + let relay_hint = repo_ref.relays.first().cloned(); sign_event( EventBuilder::new( @@ -104,6 +104,8 @@ pub async fn generate_patch_event( git_repo .make_patch_from_commit(commit, &series_count) .context(format!("failed to make patch for commit {commit}"))?, + ) + .tags( [ repo_ref .maintainers @@ -141,6 +143,7 @@ pub async fn generate_patch_event( relay_url: relay_hint.clone(), marker: Some(Marker::Root), public_key: None, + uppercase: false, })] } else if let Some(event_ref) = root_proposal_id.clone() { vec![ @@ -165,6 +168,7 @@ pub async fn generate_patch_event( relay_url: relay_hint.clone(), marker: Some(Marker::Reply), public_key: None, + uppercase: false, })] } else { vec![] @@ -256,9 +260,10 @@ pub fn event_tag_from_nip19_or_hex( Nip19::Event(n) => { break Ok(Tag::from_standardized(nostr_sdk::TagStandard::Event { event_id: n.event_id, - relay_url: n.relays.first().map(UncheckedUrl::new), + relay_url: n.relays.first().and_then(|url| RelayUrl::parse(url).ok()), marker: Some(marker), public_key: None, + uppercase: false, })); } Nip19::EventId(id) => { @@ -267,6 +272,7 @@ pub fn event_tag_from_nip19_or_hex( relay_url: None, marker: Some(marker), public_key: None, + uppercase: false, })); } Nip19::Coordinate(coordinate) => { @@ -291,6 +297,7 @@ pub fn event_tag_from_nip19_or_hex( relay_url: None, marker: Some(marker), public_key: None, + uppercase: false, })); } if prompt_for_correction { @@ -326,7 +333,8 @@ pub async fn generate_cover_letter_and_patch_events( "From {} Mon Sep 17 00:00:00 2001\nSubject: [PATCH 0/{}] {title}\n\n{description}", commits.last().unwrap(), commits.len() - ), + )) + .tags( [ repo_ref.maintainers.iter().map(|m| Tag::coordinate(Coordinate { kind: nostr::Kind::GitRepoAnnouncement, @@ -618,7 +626,8 @@ mod tests { Ok(nostr::event::EventBuilder::new( nostr::event::Kind::GitPatch, format!("From ea897e987ea9a7a98e7a987e97987ea98e7a3334 Mon Sep 17 00:00:00 2001\nSubject: [PATCH 0/2] {title}\n\n{description}"), - [ + ) + .tags([ Tag::hashtag("cover-letter"), Tag::hashtag("root"), ], diff --git a/src/lib/login/fresh.rs b/src/lib/login/fresh.rs index 23c4bdc..615c0a6 100644 --- a/src/lib/login/fresh.rs +++ b/src/lib/login/fresh.rs @@ -5,7 +5,7 @@ use console::Style; use dialoguer::theme::{ColorfulTheme, Theme}; use nostr::nips::{nip05, nip46::NostrConnectURI}; use nostr_connect::client::NostrConnect; -use nostr_sdk::{EventBuilder, Keys, Metadata, NostrSigner, PublicKey, ToBech32, Url}; +use nostr_sdk::{EventBuilder, Keys, Metadata, NostrSigner, PublicKey, RelayUrl, ToBech32}; use qrcode::QrCode; use tokio::{signal, sync::Mutex}; @@ -370,8 +370,8 @@ pub fn generate_nostr_connect_app( client .get_fallback_signer_relays() .iter() - .flat_map(|s| Url::parse(s)) - .collect::>() + .flat_map(RelayUrl::parse) + .collect::>() } else { vec![] }; @@ -438,8 +438,8 @@ pub async fn listen_for_remote_signer( let bunker_url = NostrConnectURI::Bunker { // TODO the remote signer pubkey may not be the user pubkey remote_signer_public_key: public_key, - relays: nostr_connect_url.relays(), - secret: nostr_connect_url.secret(), + relays: nostr_connect_url.relays().to_vec(), + secret: nostr_connect_url.secret().map(String::from), }; Ok((signer, public_key, bunker_url)) } else { @@ -727,7 +727,7 @@ async fn signup( client .get_fallback_relays() .iter() - .map(|s| (Url::parse(s).unwrap(), None)), + .map(|s| (RelayUrl::parse(s).unwrap(), None)), ) .sign_with_keys(&keys)?; eprintln!("publishing user profile to relays"); diff --git a/src/lib/repo_ref.rs b/src/lib/repo_ref.rs index 05234e2..8319c78 100644 --- a/src/lib/repo_ref.rs +++ b/src/lib/repo_ref.rs @@ -9,7 +9,7 @@ use std::{ use anyhow::{bail, Context, Result}; use console::Style; use nostr::{nips::nip01::Coordinate, FromBech32, PublicKey, Tag, TagStandard, ToBech32}; -use nostr_sdk::{Kind, NostrSigner, Timestamp}; +use nostr_sdk::{Kind, NostrSigner, RelayUrl, Timestamp}; use serde::{Deserialize, Serialize}; #[cfg(not(test))] @@ -28,7 +28,7 @@ pub struct RepoRef { pub root_commit: String, pub git_server: Vec, pub web: Vec, - pub relays: Vec, + pub relays: Vec, pub maintainers: Vec, pub events: HashMap, // code languages and hashtags @@ -78,8 +78,11 @@ impl TryFrom for RepoRef { } if let Some(t) = event.tags.iter().find(|t| t.as_slice()[0].eq("relays")) { - r.relays = t.clone().to_vec(); - r.relays.remove(0); + for relay in t.clone().to_vec() { + if let Ok(relay) = RelayUrl::parse(relay) { + r.relays.push(relay); + } + } } if let Some(t) = event @@ -119,9 +122,7 @@ impl TryFrom for RepoRef { impl RepoRef { pub async fn to_event(&self, signer: &Arc) -> Result { sign_event( - nostr_sdk::EventBuilder::new( - nostr::event::Kind::GitRepoAnnouncement, - "", + nostr_sdk::EventBuilder::new(nostr::event::Kind::GitRepoAnnouncement, "").tags( [ vec![ Tag::identifier(if self.identifier.to_string().is_empty() { @@ -158,7 +159,7 @@ impl RepoRef { ), Tag::custom( nostr::TagKind::Custom(std::borrow::Cow::Borrowed("relays")), - self.relays.clone(), + self.relays.iter().map(|r| r.to_string()), ), Tag::custom( nostr::TagKind::Custom(std::borrow::Cow::Borrowed("maintainers")), @@ -206,7 +207,7 @@ impl RepoRef { .unwrap(), identifier: self.identifier.clone(), relays: if let Some(relay) = self.relays.first() { - vec![relay.to_string()] + vec![relay.clone()] } else { vec![] }, @@ -481,7 +482,10 @@ mod tests { "https://exampleproject.xyz".to_string(), "https://gitworkshop.dev/123".to_string(), ], - relays: vec!["ws://relay1.io".to_string(), "ws://relay2.io".to_string()], + relays: vec![ + RelayUrl::parse("ws://relay1.io").unwrap(), + RelayUrl::parse("ws://relay2.io").unwrap(), + ], maintainers: vec![TEST_KEY_1_KEYS.public_key(), TEST_KEY_2_KEYS.public_key()], events: HashMap::new(), } @@ -592,7 +596,10 @@ mod tests { async fn relays() { assert_eq!( RepoRef::try_from(create().await).unwrap().relays, - vec!["ws://relay1.io".to_string(), "ws://relay2.io".to_string()], + vec![ + RelayUrl::parse("ws://relay1.io").unwrap(), + RelayUrl::parse("ws://relay2.io").unwrap(), + ], ) } -- cgit v1.2.3