Skip to content

Instantly share code, notes, and snippets.

@farzadshbfn
Last active May 4, 2020 12:41
Show Gist options
  • Save farzadshbfn/7e9ac9b584749c9de47631cd9df2c94b to your computer and use it in GitHub Desktop.
Save farzadshbfn/7e9ac9b584749c9de47631cd9df2c94b to your computer and use it in GitHub Desktop.
struct User {
typealias Id = String
let id: Id
let cellNumber: CellNumber
let status: Status
enum Status {
case notRegistered
case registered(profile: Profile)
}
}
extension User: Codable {
private enum CodingKeys: String, CodingKey {
case id
case cellNumber = "cell_number"
case isRegistered = "is_registered"
case profile
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Id.self, forKey: .id) // notice Id.self instead of String.self
cellNumber = try container.decode(CellNumber.self, forKey: .cellNumber)
let isRegistered = try container.decode(Bool.self, forKey: .isRegistered)
status = isRegistered ? try .registered(profile: container.decode(Profile.self, forKey: .profile)) : .notRegistered
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(cellNumber, forKey: .cellNumber)
switch status {
case .notRegistered:
try container.encode(false, forKey: .isRegistered)
case .registered(let profile):
try container.encode(true, forKey: .isRegistered)
try container.encode(profile, forKey: .profile)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment