Created
December 5, 2018 02:16
-
-
Save JoeMatt/a1f8eccecfb50c2da5149d19b6ca1ba8 to your computer and use it in GitHub Desktop.
Example of codeable with nested values without using nested structs
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
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