DamusPurpleURL.swift (1975B)
1 // 2 // DamusPurpleURL.swift 3 // damus 4 // 5 // Created by Daniel Nogueira on 2024-01-13. 6 // 7 8 import Foundation 9 10 11 struct DamusPurpleURL: Equatable { 12 let is_staging: Bool 13 let variant: Self.Variant 14 15 enum Variant: Equatable { 16 case verify_npub(checkout_id: String) 17 case welcome(checkout_id: String) 18 case landing 19 } 20 21 init(is_staging: Bool, variant: Self.Variant) { 22 self.is_staging = is_staging 23 self.variant = variant 24 } 25 26 init?(url: URL) { 27 guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return nil } 28 guard components.scheme == "damus" else { return nil } 29 let is_staging = components.find("staging") != nil 30 switch components.path { 31 case "purple:verify": 32 guard let checkout_id = components.find("id") else { return nil } 33 self = .init(is_staging: is_staging, variant: .verify_npub(checkout_id: checkout_id)) 34 case "purple:welcome": 35 guard let checkout_id = components.find("id") else { return nil } 36 self = .init(is_staging: is_staging, variant: .welcome(checkout_id: checkout_id)) 37 case "purple:landing": 38 self = .init(is_staging: is_staging, variant: .landing) 39 default: 40 return nil 41 } 42 } 43 44 func url_string() -> String { 45 let staging = is_staging ? "&staging=true" : "" 46 switch self.variant { 47 case .verify_npub(let id): 48 return "damus:purple:verify?id=\(id)\(staging)" 49 case .welcome(let id): 50 return "damus:purple:welcome?id=\(id)\(staging)" 51 case .landing: 52 let staging = is_staging ? "?staging=true" : "" 53 return "damus:purple:landing\(staging)" 54 } 55 } 56 57 } 58 59 extension URLComponents { 60 func find(_ name: String) -> String? { 61 self.queryItems?.first(where: { qi in qi.name == name })?.value 62 } 63 }