import Foundation /// Rich text annotation (app.bsky.richtext.facet) struct Facet: Codable, Sendable { let index: ByteSlice let features: [FacetFeature] struct ByteSlice: Codable, Sendable { let byteStart: Int let byteEnd: Int } } enum FacetFeature: Codable, Sendable { case mention(did: String) case link(uri: String) case tag(tag: String) enum CodingKeys: String, CodingKey { case type = "$type" case did case uri case tag } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) let type = try container.decode(String.self, forKey: .type) switch type { case "app.bsky.richtext.facet#mention": let did = try container.decode(String.self, forKey: .did) self = .mention(did: did) case "app.bsky.richtext.facet#link": let uri = try container.decode(String.self, forKey: .uri) self = .link(uri: uri) case "app.bsky.richtext.facet#tag": let tag = try container.decode(String.self, forKey: .tag) self = .tag(tag: tag) default: throw DecodingError.dataCorruptedError(forKey: .type, in: container, debugDescription: "Unknown facet type: \(type)") } } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) switch self { case let .mention(did): try container.encode("app.bsky.richtext.facet#mention", forKey: .type) try container.encode(did, forKey: .did) case let .link(uri): try container.encode("app.bsky.richtext.facet#link", forKey: .type) try container.encode(uri, forKey: .uri) case let .tag(tag): try container.encode("app.bsky.richtext.facet#tag", forKey: .type) try container.encode(tag, forKey: .tag) } } }