Skip to content

Instantly share code, notes, and snippets.

@JoeMatt
Created December 5, 2018 02:16
Show Gist options
  • Save JoeMatt/a1f8eccecfb50c2da5149d19b6ca1ba8 to your computer and use it in GitHub Desktop.
Save JoeMatt/a1f8eccecfb50c2da5149d19b6ca1ba8 to your computer and use it in GitHub Desktop.
Example of codeable with nested values without using nested structs
protocol SOAPElement : Codable {
static var namespace : String { get }
static var uri : String { get }
}
protocol WSSEElement : SOAPElement {}
/*
<wsse:Security>
<wsse:UsernameToken>
<wsse:Password>SALIDO</wsse:Password>
<wsse:Username>SALIDO</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
*/
struct WSSE_BASIC : WSSEElement {
let username : String
let password : String
struct UsernameToken : Codable {
let username : String
let password : String
}
static let namespace :String = "wsse"
static let uri: String = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
enum CodingKeys: String, CodingKey {
case usernameToken = "wsse:UsernameToken"
}
enum UsernameTokenKeys: String, CodingKey {
case username = "wsse:Username"
case password = "wsse:Password"
}
}
extension WSSE_BASIC: Decodable {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let usernameToken = try values.nestedContainer(keyedBy: UsernameTokenKeys.self, forKey: .usernameToken)
username = try usernameToken.decode(String.self, forKey: .username)
password = try usernameToken.decode(String.self, forKey: .password)
}
}
extension WSSE_BASIC: Encodable {
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
var usernameToken = container.nestedContainer(keyedBy: UsernameTokenKeys.self, forKey: .usernameToken)
try usernameToken.encode(username, forKey: .username)
try usernameToken.encode(password, forKey: .password)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment