@@ -44,21 +44,22 @@ struct {{ obj.name|Camelize }}{{ suffix }}: EventExtras {
4444 }
4545{ % endmacro % }
4646
47- { %- macro generate_structure ( name, struct) % }
47+ { %- macro generate_structure ( name, struct, toplevel ) % }
4848{ %- if struct. type == " oneof " -% }
49- enum { { name } } : Codable, Equatable, ObjectSerialize {
49+ enum { { name } } : Codable, Equatable {
5050 { % for ty in struct. subtypes % }
5151 case { { ty} } ( { { ty|structure_type_name} } )
5252 { % endfor % }
5353
54- func intoSerializedObject( ) -> String {
55- switch self {
56- { % for ty in struct. subtypes % }
57- case . { { ty} } ( let val) :
58- return val. intoSerializedObject ( )
59- { % endfor % }
60- }
61- }
54+ func encode( to __encoder: Encoder ) throws {
55+ var __container = __encoder. singleValueContainer ( )
56+ switch self {
57+ { % for ty in struct. subtypes % }
58+ case . { { ty} } ( let __val) :
59+ try __container. encode ( __val)
60+ { % endfor % }
61+ }
62+ }
6263 }
6364
6465{ %- elif struct . type == " array " -% }
@@ -67,7 +68,7 @@ struct {{ obj.name|Camelize }}{{ suffix }}: EventExtras {
6768 { { generate_structure ( name ~ " Item " , struct [ " items " ] ) } }
6869
6970{ %- elif struct . type == " object " -% }
70- struct { { name } } : Codable, Equatable, ObjectSerialize {
71+ struct { { name } } : Codable, Equatable { % if toplevel % } , ObjectSerialize{ % endif % } {
7172 { % for itemname, val in struct. properties. items ( ) % }
7273 { %- set varname = itemname|camelize|variable_name -% }
7374 { % if val. type == " array " % }
@@ -81,26 +82,36 @@ struct {{ obj.name|Camelize }}{{ suffix }}: EventExtras {
8182 { % endif % }
8283 { % endfor % }
8384
84- func intoSerializedObject( ) -> String {
85- var __obj = [ String] ( )
85+ enum CodingKeys: String , CodingKey {
86+ { % for itemname, val in struct . properties. items ( ) % }
87+ { %- set varname = itemname|camelize|variable_name -% }
88+ case { { varname} } = " {{ itemname }} "
89+ { % endfor % }
90+ }
91+
92+ func encode( to encoder: Encoder ) throws {
93+ var container = encoder. container ( keyedBy: CodingKeys . self)
8694 { % for itemname, val in struct. properties. items ( ) % }
87- { %- set varname = itemname|camelize|variable_name -% }
88- { % if val. type == " array " % }
89- if { { varname} } . count > 0 {
90- let { { varname} } = self . { { varname} }
91- { % else % }
92- if let { { varname} } = self . { { varname} } {
93- { % endif % }
94- var __elem = " \" {{itemname}} \" : "
95- __elem. append ( { { varname} } . intoSerializedObject ( ) )
96- __obj. append ( __elem)
97- }
95+ { %- set varname = itemname|camelize|variable_name -% }
96+ { % if val. type == " array " % }
97+ if { { varname} } . count > 0 {
98+ let { { varname} } = self . { { varname} }
99+ { % else % }
100+ if let { { varname} } = self . { { varname} } {
101+ { % endif % }
102+ try container. encode ( { { varname} } , forKey: . { { varname} } )
103+ }
98104 { % endfor % }
99- var __json = " { "
100- __json. append ( __obj. joined ( separator: " , " ) )
101- __json. append ( " } " )
102- return __json
105+ }
106+
107+ { % if toplevel % }
108+ func intoSerializedObject( ) - > String {
109+ let jsonEncoder = JSONEncoder ( )
110+ let jsonData = try ! jsonEncoder. encode ( self )
111+ let json = String ( data: jsonData, encoding: String . Encoding. utf8) !
112+ return json
103113 }
114+ { % endif % }
104115 }
105116
106117 { % for itemname, val in struct. properties. items ( ) % }
@@ -191,7 +202,7 @@ extension {{ namespace }} {
191202 enum { { category. name|Camelize } } {
192203 { % for obj in category. objs. values ( ) % }
193204 { % if obj|attr ( " _generate_structure " ) % }
194- { { generate_structure ( obj. name|Camelize ~ " Object " , obj. _generate_structure) } }
205+ { { generate_structure ( obj. name|Camelize ~ " Object " , obj. _generate_structure, true ) } }
195206 { %- endif % }
196207 { % if obj|attr ( " _generate_enums " ) % }
197208 { % for name, suffix in obj [ " _generate_enums " ] % }
0 commit comments