Skip to content

Tags: add shorthand functions for easier usage and readability #122

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 21 additions & 21 deletions Sources/NostrSDK/EventCreating.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public extension EventCreating {
///
/// > Note: [NIP-02 Specification](https://github.com/nostr-protocol/nips/blob/master/02.md#contact-list-and-petnames)
func contactList(withPubkeys pubkeys: [String], signedBy keypair: Keypair) throws -> ContactListEvent {
try contactList(withPubkeyTags: pubkeys.map { Tag(name: .pubkey, value: $0) },
try contactList(withPubkeyTags: pubkeys.map { .pubkey($0) },
signedBy: keypair)
}

Expand Down Expand Up @@ -109,7 +109,7 @@ public extension EventCreating {
throw EventCreatingError.invalidInput
}

let recipientTag = Tag(name: .pubkey, value: pubkey.hex)
let recipientTag = Tag.pubkey(pubkey.hex)
return try DirectMessageEvent(content: encryptedMessage, tags: [recipientTag], signedBy: keypair)
}

Expand All @@ -129,7 +129,7 @@ public extension EventCreating {
throw EventCreatingError.invalidInput
}

let tags = creatorValidatedEvents.map { Tag(name: .event, value: $0.id) }
let tags: [Tag] = creatorValidatedEvents.map { .event($0.id) }
return try DeletionEvent(content: reason ?? "", tags: tags, signedBy: keypair)
}

Expand All @@ -145,14 +145,14 @@ public extension EventCreating {
guard let stringifiedJSON = String(data: jsonData, encoding: .utf8) else {
throw EventCreatingError.invalidInput
}
var tags = [
Tag(name: .event, value: event.id),
Tag(name: .pubkey, value: event.pubkey)
var tags: [Tag] = [
.event(event.id),
.pubkey(event.pubkey)
]
if event.kind == .textNote {
return try TextNoteRepostEvent(content: stringifiedJSON, tags: tags, signedBy: keypair)
} else {
tags.append(Tag(name: .kind, value: String(event.kind.rawValue)))
tags.append(.kind(event.kind))

return try GenericRepostEvent(content: stringifiedJSON, tags: tags, signedBy: keypair)
}
Expand All @@ -167,8 +167,8 @@ public extension EventCreating {
///
/// See [NIP-25 - Reactions](https://github.com/nostr-protocol/nips/blob/master/25.md)
func reaction(withContent content: String, reactedEvent: NostrEvent, signedBy keypair: Keypair) throws -> ReactionEvent {
let eventTag = Tag(name: .event, value: reactedEvent.id)
let pubkeyTag = Tag(name: .pubkey, value: reactedEvent.pubkey)
let eventTag = Tag.event(reactedEvent.id)
let pubkeyTag = Tag.pubkey(reactedEvent.pubkey)

var tags = reactedEvent.tags.filter { $0.name == TagName.event.rawValue || $0.name == TagName.pubkey.rawValue }
tags.append(eventTag)
Expand All @@ -186,8 +186,8 @@ public extension EventCreating {
///
/// See [NIP-25 - Reactions](https://github.com/nostr-protocol/nips/blob/master/25.md)
func reaction(withCustomEmoji customEmoji: CustomEmoji, reactedEvent: NostrEvent, signedBy keypair: Keypair) throws -> ReactionEvent {
let eventTag = Tag(name: .event, value: reactedEvent.id)
let pubkeyTag = Tag(name: .pubkey, value: reactedEvent.pubkey)
let eventTag = Tag.event(reactedEvent.id)
let pubkeyTag = Tag.pubkey(reactedEvent.pubkey)

var tags = reactedEvent.tags.filter { $0.name == TagName.event.rawValue || $0.name == TagName.pubkey.rawValue }
tags.append(eventTag)
Expand All @@ -206,7 +206,7 @@ public extension EventCreating {
/// - Returns: The signed ``ReportEvent``.
func reportUser(withPublicKey pubkey: PublicKey, reportType: ReportType, additionalInformation: String = "", signedBy keypair: Keypair) throws -> ReportEvent {
try ReportEvent(content: additionalInformation,
tags: [Tag(name: .pubkey, value: pubkey.hex, otherParameters: [reportType.rawValue])],
tags: [.pubkey(pubkey.hex, otherParameters: [reportType.rawValue])],
signedBy: keypair)
}

Expand All @@ -221,9 +221,9 @@ public extension EventCreating {
guard reportType != .impersonation else {
throw EventCreatingError.invalidInput
}
let tags = [
Tag(name: .event, value: note.id, otherParameters: [reportType.rawValue]),
Tag(name: .pubkey, value: note.pubkey)
let tags: [Tag] = [
.event(note.id, otherParameters: [reportType.rawValue]),
.pubkey(note.pubkey)
]
return try ReportEvent(content: additionalInformation, tags: tags, signedBy: keypair)
}
Expand Down Expand Up @@ -252,13 +252,13 @@ public extension EventCreating {
var publicTags = [Tag]()

for pubkey in publiclyMutedPubkeys {
publicTags.append(Tag(name: .pubkey, value: pubkey))
publicTags.append(.pubkey(pubkey))
}
for eventId in publiclyMutedEventIds {
publicTags.append(Tag(name: .event, value: eventId))
publicTags.append(.event(eventId))
}
for hashtag in publiclyMutedHashtags {
publicTags.append(Tag(name: .hashtag, value: hashtag))
publicTags.append(.hashtag(hashtag))
}
for keyword in publiclyMutedKeywords {
publicTags.append(Tag(name: .word, value: keyword))
Expand Down Expand Up @@ -328,7 +328,7 @@ public extension EventCreating {

if let hashtags {
for hashtag in hashtags {
tags.append(Tag(name: .hashtag, value: hashtag))
tags.append(.hashtag(hashtag))
}
}

Expand Down Expand Up @@ -388,7 +388,7 @@ public extension EventCreating {
}

if let hashtags, !hashtags.isEmpty {
tags += hashtags.map { Tag(name: .hashtag, value: $0) }
tags += hashtags.map { .hashtag($0) }
}

if let references, !references.isEmpty {
Expand Down Expand Up @@ -457,7 +457,7 @@ public extension EventCreating {
}

if let hashtags {
tags += hashtags.map { Tag(name: .hashtag, value: $0) }
tags += hashtags.map { .hashtag($0) }
}

if let references {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ public struct CalendarEventParticipant: PubkeyProviding, RelayProviding, RelayUR
if let role, !role.isEmpty {
otherParameters.append(role)
}

tag = Tag(name: .pubkey, value: pubkey.hex, otherParameters: otherParameters)
tag = Tag.pubkey(pubkey.hex, otherParameters: otherParameters)
}
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/NostrSDK/Events/ContactListEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public final class ContactListEvent: NostrEvent {

/// Pubkeys for followed/known profiles.
public var contactPubkeys: [String] {
tags.filter({ $0.name == TagName.pubkey.rawValue }).map { $0.value }
allValues(forTagName: .pubkey) ?? []
}

/// Pubkey tags for followed/known profiles.
Expand Down
2 changes: 1 addition & 1 deletion Sources/NostrSDK/Events/DeletionEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ public final class DeletionEvent: NostrEvent {

/// The event ids that the creator requests deletion for.
public var deletedEventIds: [String] {
tags.filter { $0.name == TagName.event.rawValue }.map { $0.value }
allValues(forTagName: .event) ?? []
}
}
3 changes: 1 addition & 2 deletions Sources/NostrSDK/Events/Tags/HashtagInterpreting.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ public protocol HashtagInterpreting: NostrEvent {}
public extension HashtagInterpreting {
/// The hashtags of the event.
var hashtags: [String] {
tags.filter { $0.name == TagName.hashtag.rawValue }
.map { $0.value }
allValues(forTagName: .hashtag) ?? []
}
}
3 changes: 1 addition & 2 deletions Sources/NostrSDK/Events/Tags/ReferenceTagInterpreting.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ public protocol ReferenceTagInterpreting: NostrEvent {}
public extension ReferenceTagInterpreting {
/// The reference URLs of the event.
var references: [URL] {
tags.filter { $0.name == TagName.webURL.rawValue }
.compactMap { URL(string: $0.value) }
allValues(forTagName: .webURL)?.compactMap { URL(string: $0) } ?? []
}
}
8 changes: 3 additions & 5 deletions Sources/NostrSDK/Events/TextNoteEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,18 @@ public final class TextNoteEvent: NostrEvent, CustomEmojiInterpreting {

/// Pubkeys mentioned in the note content.
public var mentionedPubkeys: [String] {
let pubkeyTags = tags.filter { $0.name == TagName.pubkey.rawValue }
return pubkeyTags.map { $0.value }
allValues(forTagName: .pubkey) ?? []
}

/// Events mentioned in the note content.
public var mentionedEventIds: [String] {
let eventTags = tags.filter { $0.name == TagName.event.rawValue }
return eventTags.map { $0.value }
allValues(forTagName: .event) ?? []
}

/// a short subject for a text note, similar to subjects in emails.
///
/// See [NIP-14 - Subject tag in Text events](https://github.com/nostr-protocol/nips/blob/master/14.md).
public var subject: String? {
tags.first(where: { $0.name == TagName.subject.rawValue })?.value
firstValueForTagName(.subject)
}
}
36 changes: 36 additions & 0 deletions Sources/NostrSDK/Tag.swift
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,42 @@ public class Tag: Codable, Equatable {
}
}

/// Shortcuts for creating common tags
extension Tag {

/// An event ``Tag`` with the provided id and other parameters.
/// - Parameters:
/// - eventId: The event id.
/// - otherParameters: The other parameters.
/// - Returns: The event ``Tag``.
static func event(_ eventId: String, otherParameters: [String] = []) -> Tag {
Tag(name: .event, value: eventId, otherParameters: otherParameters)
}

/// A hashtag ``Tag`` with the provided value.
/// - Parameter hashtag: The hashtag.
/// - Returns: The hashtag ``Tag``.
static func hashtag(_ hashtag: String) -> Tag {
Tag(name: .hashtag, value: hashtag)
}

/// A kind ``Tag`` with the provided value.
/// - Parameter kind: The kind (``EventKind``).
/// - Returns: The kind ``Tag``.
static func kind(_ kind: EventKind) -> Tag {
Tag(name: .kind, value: String(kind.rawValue))
}

/// A pubkey ``Tag`` with the provided pubkey.
/// - Parameters:
/// - pubkey: The pubkey.
/// - otherParameters: The other parameters.
/// - Returns: The pubkey ``Tag``.
static func pubkey(_ pubkey: String, otherParameters: [String] = []) -> Tag {
Tag(name: .pubkey, value: pubkey, otherParameters: otherParameters)
}
}

extension Tag: CustomDebugStringConvertible {
public var debugDescription: String {
"Tag(name: \"\(name)\", value: \"\(value)\")"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ final class CalendarEventParticipantTests: XCTestCase {
let pubkey = Keypair.test.publicKey
let relay = "wss://relay.nostrsdk.com"
let role = "organizer"
let tag = Tag(name: .pubkey, value: pubkey.hex, otherParameters: [relay, role])
let tag = Tag.pubkey(pubkey.hex, otherParameters: [relay, role])
let calendarEventParticipant = try XCTUnwrap(CalendarEventParticipant(pubkeyTag: tag))

XCTAssertEqual(calendarEventParticipant.pubkey, pubkey)
Expand Down
Loading