Id.swift (2792B)
1 // 2 // Id.swift 3 // damus 4 // 5 // Created by William Casarin on 2023-07-26. 6 // 7 8 import Foundation 9 10 struct TagRef<T>: Hashable, Equatable, Encodable { 11 let elem: TagElem 12 13 init(_ elem: TagElem) { 14 self.elem = elem 15 } 16 17 func encode(to encoder: Encoder) throws { 18 var container = encoder.singleValueContainer() 19 try container.encode(elem.string()) 20 } 21 } 22 23 protocol TagKey { 24 var keychar: AsciiCharacter { get } 25 } 26 27 protocol TagKeys { 28 associatedtype TagKeys: TagKey 29 var key: TagKeys { get } 30 } 31 32 protocol TagConvertible { 33 var tag: [String] { get } 34 static func from_tag(tag: TagSequence) -> Self? 35 } 36 37 struct QuoteId: IdType, TagKey, TagConvertible { 38 let id: Data 39 40 init(_ data: Data) { 41 self.id = data 42 } 43 44 /// The note id being quoted 45 var note_id: NoteId { 46 NoteId(self.id) 47 } 48 49 var keychar: AsciiCharacter { "q" } 50 51 var tag: [String] { 52 ["q", self.hex()] 53 } 54 55 static func from_tag(tag: TagSequence) -> QuoteId? { 56 var i = tag.makeIterator() 57 58 guard tag.count >= 2, 59 let t0 = i.next(), 60 let key = t0.single_char, 61 key == "q", 62 let t1 = i.next(), 63 let quote_id = t1.id().map(QuoteId.init) 64 else { return nil } 65 66 return quote_id 67 } 68 } 69 70 71 struct Privkey: IdType { 72 let id: Data 73 74 var nsec: String { 75 bech32_privkey(self) 76 } 77 78 init?(hex: String) { 79 guard let id = hex_decode_id(hex) else { 80 return nil 81 } 82 self.init(id) 83 } 84 85 init(_ data: Data) { 86 self.id = data 87 } 88 } 89 90 91 struct Hashtag: TagConvertible, Hashable { 92 let hashtag: String 93 94 static func from_tag(tag: TagSequence) -> Hashtag? { 95 var i = tag.makeIterator() 96 97 guard tag.count >= 2, 98 let t0 = i.next(), 99 let chr = t0.single_char, 100 chr == "t", 101 let t1 = i.next() else { 102 return nil 103 } 104 105 return Hashtag(hashtag: t1.string()) 106 } 107 108 var tag: [String] { ["t", self.hashtag] } 109 var keychar: AsciiCharacter { "t" } 110 } 111 112 struct ReplaceableParam: TagConvertible { 113 let param: TagElem 114 115 static func from_tag(tag: TagSequence) -> ReplaceableParam? { 116 var i = tag.makeIterator() 117 118 guard tag.count >= 2, 119 let t0 = i.next(), 120 let chr = t0.single_char, 121 chr == "d", 122 let t1 = i.next() else { 123 return nil 124 } 125 126 return ReplaceableParam(param: t1) 127 } 128 129 var tag: [String] { [self.keychar.description, self.param.string()] } 130 var keychar: AsciiCharacter { "d" } 131 } 132 133 struct Signature: Hashable, Equatable { 134 let data: Data 135 136 init(_ p: Data) { 137 self.data = p 138 } 139 }