@@ -79,80 +79,80 @@ internal class _XMLElement {
7979 self . init ( key: key, value: nil , attributes: attributes. mapValues ( { $0. description } ) , children: children)
8080 }
8181
82- static func createRootElement( rootKey: String , object: NSObject ) -> _XMLElement ? {
82+ static func createRootElement( rootKey: String , header : XMLHeader ? , options : XMLEncoder . _Options , object: Container ) throws -> Data {
8383 let element = _XMLElement ( key: rootKey)
8484
85- if let object = object as? NSDictionary {
86- _XMLElement. modifyElement ( element: element, parentElement: nil , key: nil , object: object)
87- } else if let object = object as? NSArray {
88- _XMLElement. createElement ( parentElement: element, key: rootKey, object: object)
85+ switch object {
86+ case . dictionary( let dictionary) :
87+ _XMLElement. modifyElement ( element: element, parentElement: nil , key: nil , values: dictionary)
88+ case . array( let array) :
89+ _XMLElement. createElement ( parentElement: element, key: rootKey, object: array)
90+ default :
91+ throw EncodingError . invalidValue ( object, EncodingError . Context ( codingPath: [ ] , debugDescription: " Top-level encoded as non-root XML fragment. " ) )
8992 }
9093
91- return element
94+ return element. toXMLString ( with : header , withCDATA : options . stringEncodingStrategy != . deferredToString ) . data ( using : . utf8 , allowLossyConversion : true ) !
9295 }
9396
94- fileprivate static func createElement( parentElement: _XMLElement ? , key: String , object: NSDictionary ) {
97+ fileprivate static func createElement( parentElement: _XMLElement ? , key: String , object: [ String : Container ] ) {
9598 let element = _XMLElement ( key: key)
9699
97- modifyElement ( element: element, parentElement: parentElement, key: key, object : object)
100+ modifyElement ( element: element, parentElement: parentElement, key: key, values : object)
98101 }
99102
100- fileprivate static func modifyElement( element: _XMLElement , parentElement: _XMLElement ? , key: String ? , object: NSDictionary ) {
101- element. attributes = ( object [ _XMLElement. attributesKey] as? [ String : Any ] ) ? . mapValues ( { String ( describing: $0) } ) ?? [ : ]
103+ private static func modifyContainerElement( container: Container , element: _XMLElement , key: String ) {
104+ switch container {
105+ case . dictionary( let values) :
106+ _XMLElement. createElement ( parentElement: element, key: key, object: values)
107+ case . array( let values) :
108+ _XMLElement. createElement ( parentElement: element, key: key, object: values)
109+ case . boolean( let value) :
110+ _XMLElement. createElement ( parentElement: element, key: key, value: value)
111+ case . string( let value) :
112+ _XMLElement. createElement ( parentElement: element, key: key, value: value)
113+ case . int64( let value) :
114+ _XMLElement. createElement ( parentElement: element, key: key, value: value)
115+ case . uint64( let value) :
116+ _XMLElement. createElement ( parentElement: element, key: key, value: value)
117+ case . double( let value) :
118+ _XMLElement. createElement ( parentElement: element, key: key, value: value)
119+ case . null:
120+ _XMLElement. createNullElement ( parentElement: element, key: key)
121+ }
122+ }
123+
124+ private static func modifyElement( element: _XMLElement , parentElement: _XMLElement ? , key: String ? , values: [ String : Container ] ) {
125+ if let attributesContainer = values [ _XMLElement. attributesKey] , case let . dictionary( attributes) = attributesContainer {
126+ element. attributes = attributes. mapValues ( { String ( describing: $0) } )
127+ }
102128
103- let objects : [ ( String , NSObject ) ] = object . compactMap ( {
104- guard let key = $0 as? String , let value = $1 as? NSObject , key != _XMLElement. attributesKey else { return nil }
129+ let filteredValues : [ ( String , Container ) ] = values . compactMap ( {
130+ guard $0 != _XMLElement. attributesKey else { return nil }
105131
106- return ( key , value )
132+ return ( $0 , $1 )
107133 } )
108134
109- for (key, value) in objects {
110- if let dict = value as? NSDictionary {
111- _XMLElement. createElement ( parentElement: element, key: key, object: dict)
112- } else if let array = value as? NSArray {
113- _XMLElement. createElement ( parentElement: element, key: key, object: array)
114- } else if let string = value as? NSString {
115- _XMLElement. createElement ( parentElement: element, key: key, object: string)
116- } else if let number = value as? NSNumber {
117- _XMLElement. createElement ( parentElement: element, key: key, object: number)
118- } else {
119- _XMLElement. createElement ( parentElement: element, key: key, object: NSNull ( ) )
120- }
135+ for (key, value) in filteredValues {
136+ modifyContainerElement ( container: value, element: element, key: key)
121137 }
122138
123139 if let parentElement = parentElement, let key = key {
124140 parentElement. children [ key] = ( parentElement. children [ key] ?? [ ] ) + [ element]
125141 }
126142 }
127143
128- fileprivate static func createElement( parentElement: _XMLElement , key: String , object: NSArray ) {
129- let objects = object. compactMap ( { $0 as? NSObject } )
130- objects. forEach ( {
131- if let dict = $0 as? NSDictionary {
132- _XMLElement. createElement ( parentElement: parentElement, key: key, object: dict)
133- } else if let array = $0 as? NSArray {
134- _XMLElement. createElement ( parentElement: parentElement, key: key, object: array)
135- } else if let string = $0 as? NSString {
136- _XMLElement. createElement ( parentElement: parentElement, key: key, object: string)
137- } else if let number = $0 as? NSNumber {
138- _XMLElement. createElement ( parentElement: parentElement, key: key, object: number)
139- } else {
140- _XMLElement. createElement ( parentElement: parentElement, key: key, object: NSNull ( ) )
141- }
144+ fileprivate static func createElement( parentElement: _XMLElement , key: String , object: [ Container ] ) {
145+ object. forEach ( {
146+ modifyContainerElement ( container: $0, element: parentElement, key: key)
142147 } )
143148 }
144-
145- fileprivate static func createElement( parentElement: _XMLElement , key: String , object: NSNumber ) {
146- let element = _XMLElement ( key: key, value: object. description)
147- parentElement. children [ key] = ( parentElement. children [ key] ?? [ ] ) + [ element]
148- }
149-
150- fileprivate static func createElement( parentElement: _XMLElement , key: String , object: NSString ) {
151- let element = _XMLElement ( key: key, value: object. description)
149+
150+ fileprivate static func createElement( parentElement: _XMLElement , key: String , value: CustomStringConvertible ) {
151+ let element = _XMLElement ( key: key, value: value. description)
152152 parentElement. children [ key] = ( parentElement. children [ key] ?? [ ] ) + [ element]
153153 }
154154
155- fileprivate static func createElement ( parentElement: _XMLElement , key: String , object : NSNull ) {
155+ fileprivate static func createNullElement ( parentElement: _XMLElement , key: String ) {
156156 let element = _XMLElement ( key: key)
157157 parentElement. children [ key] = ( parentElement. children [ key] ?? [ ] ) + [ element]
158158 }
0 commit comments