protocol SOAPElement : Codable { static var namespace : String { get } static var uri : String { get } } protocol WSSEElement : SOAPElement {} /* SALIDO SALIDO */ 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) } }