diff --git a/src/nostr_utils/mod.rs b/src/nostr_utils/mod.rs index f4ce60c..75eb758 100644 --- a/src/nostr_utils/mod.rs +++ b/src/nostr_utils/mod.rs @@ -14,6 +14,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +/// Extension traits for nostr types. +pub mod traits; +/// Utility functions for nostr. pub mod utils; use std::time::Duration; diff --git a/src/nostr_utils/traits.rs b/src/nostr_utils/traits.rs new file mode 100644 index 0000000..2a68311 --- /dev/null +++ b/src/nostr_utils/traits.rs @@ -0,0 +1,36 @@ +// n34 - A CLI to interact with NIP-34 and other stuff related to codes in nostr +// Copyright (C) 2025 Awiteb +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use nostr::event::{TagKind, TagStandard, Tags}; + + +/// A trait to add helper instance function to [`Tags`] type +#[easy_ext::ext(TagsExt)] +impl Tags { + /// Search for the given tag and map it value to a function + pub fn map_tag(&self, kind: TagKind, f: impl FnOnce(&TagStandard) -> T) -> Option { + self.find_standardized(kind).map(f) + } + + /// Search for the given tag and map it value to a function. If the tag not + /// found return the default `T` + pub fn dmap_tag(&self, kind: TagKind, f: impl FnOnce(&TagStandard) -> T) -> T + where + T: Default, + { + self.map_tag(kind, f).unwrap_or_default() + } +} diff --git a/src/nostr_utils/utils.rs b/src/nostr_utils/utils.rs index 8550a25..0b51947 100644 --- a/src/nostr_utils/utils.rs +++ b/src/nostr_utils/utils.rs @@ -21,6 +21,8 @@ use nostr::{ nips::nip34::GitRepositoryAnnouncement, }; +use super::traits::TagsExt; + /// Returns the value of the given tag fn tag_value(tag: &TagStandard) -> String { tag.clone().to_vec().remove(1) @@ -48,33 +50,16 @@ where /// Convert [`Event`] to [`GitRepositoryAnnouncement`] pub fn event_into_repo(event: Event, repo_id: impl Into) -> GitRepositoryAnnouncement { + let tags = &event.tags; + GitRepositoryAnnouncement { id: repo_id.into(), - name: event.tags.find_standardized(TagKind::Name).map(tag_value), - description: event - .tags - .find_standardized(TagKind::Description) - .map(tag_value), - web: event - .tags - .find_standardized(TagKind::Web) - .map(tag_values) - .unwrap_or_default(), - clone: event - .tags - .find_standardized(TagKind::Clone) - .map(tag_values) - .unwrap_or_default(), - relays: event - .tags - .find_standardized(TagKind::Relays) - .map(tag_values) - .unwrap_or_default(), + name: tags.map_tag(TagKind::Name, tag_value), + description: tags.map_tag(TagKind::Description, tag_value), euc: None, - maintainers: event - .tags - .find_standardized(TagKind::Maintainers) - .map(tag_values) - .unwrap_or_default(), + web: tags.dmap_tag(TagKind::Web, tag_values), + clone: tags.dmap_tag(TagKind::Clone, tag_values), + relays: tags.dmap_tag(TagKind::Relays, tag_values), + maintainers: tags.dmap_tag(TagKind::Maintainers, tag_values), } }