Idea: Could the proposal perhaps include sample synthesized code that would be generated?
For instance (and this only works with the limitations that I suggested in the post above):
enum Value: Codable {
case noValues
case allLabelled(a: String, b: String)
case singleUnlabelled(String)
}
Could have the following conformance synthesized:
enum CodingKeys: String, CodingKey {
case noValues
case allLabelled
case singleUnlabelled
}
enum AllLabelledCodingKeys: String, CodingKey {
case a
case b
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if container.contains(.noValues) {
self = .noValues
} else if container.contains(.singleUnlabelled) {
self = try .singleUnlabelled(container.decode(String.self, forKey: .singleUnlabelled))
} else if container.contains(.allLabelled) {
let nested = try container.nestedContainer(keyedBy: AllLabelledCodingKeys.self, forKey: .allLabelled)
self = try .allLabelled(
a: nested.decode(String.self, forKey: .a),
b: nested.decode(String.self, forKey: .b)
)
} else {
throw ..
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
switch self {
case .noValues:
try container.encode(true, forKey: .noValues)
case .allLabelled(let a, let b):
var nested = container.nestedContainer(keyedBy: AllLabelledCodingKeys.self, forKey: .allLabelled)
try nested.encode(a, forKey: .a)
try nested.encode(b, forKey: .b)
case .singleUnlabelled(let value):
try container.encode(value, forKey: .singleUnlabelled)
}
}