From 99e46d7633e571616e9cb25271240a8899986e45 Mon Sep 17 00:00:00 2001
From: Awiteb
Date: Mon, 5 May 2025 14:03:13 +0000
Subject: [PATCH] chore: Add a extension trait for `Tags` type
Signed-off-by: Awiteb
---
src/nostr_utils/mod.rs | 3 +++
src/nostr_utils/traits.rs | 36 ++++++++++++++++++++++++++++++++++++
src/nostr_utils/utils.rs | 35 ++++++++++-------------------------
3 files changed, 49 insertions(+), 25 deletions(-)
create mode 100644 src/nostr_utils/traits.rs
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),
}
}