Skip to content

Instantly share code, notes, and snippets.

@JoeMatt
Created December 5, 2018 02:16
Show Gist options
  • Select an option

  • Save JoeMatt/a1f8eccecfb50c2da5149d19b6ca1ba8 to your computer and use it in GitHub Desktop.

Select an option

Save JoeMatt/a1f8eccecfb50c2da5149d19b6ca1ba8 to your computer and use it in GitHub Desktop.

Revisions

  1. JoeMatt created this gist Dec 5, 2018.
    58 changes: 58 additions & 0 deletions nestedcodable.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    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)
    }
    }