public extension User { struct Avatar: Hashable { public let colorHex: String public let imageUrlPath: String? public var imageUrl: String? { imageUrlPath.flatMap { "https://avatars.devrant.com/\($0)" } } public init(colorHex: String, imageUrlPath: String?) { self.colorHex = colorHex self.imageUrlPath = imageUrlPath } } } extension User.Avatar { struct CodingData: Codable { let b: String let i: String? } } extension User.Avatar.CodingData { var decoded: User.Avatar { .init( colorHex: b, imageUrlPath: i ) } }