Last active
May 4, 2020 12:41
-
-
Save farzadshbfn/7e9ac9b584749c9de47631cd9df2c94b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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