@@ -16,18 +16,27 @@ extension OpenAPI {
1616        case  form =  " application/x-www-form-urlencoded " 
1717    } 
1818
19-     public  struct  Content :  Codable ,   Equatable  { 
19+     public  struct  Content :  Equatable  { 
2020        public  let  schema :  Either < JSONReference < Components ,  JSONSchema > ,  JSONSchema > 
2121        public  let  example :  AnyCodable ? 
2222        //        public let examples:
2323        public  let  encoding :  [ String :  Encoding ] ? 
2424
25+         /// Dictionary of vendor extensions.
26+         ///
27+         /// These should be of the form:
28+         /// `[ "x-extensionKey": <anything>]`
29+         /// where the values are anything codable.
30+         public  let  vendorExtensions :  [ String :  AnyCodable ] 
31+ 
2532        public  init ( schema:  Either < JSONReference < Components ,  JSONSchema > ,  JSONSchema > , 
2633                    example:  AnyCodable ? =  nil , 
27-                     encoding:  [ String :  Encoding ] ? =  nil )  { 
34+                     encoding:  [ String :  Encoding ] ? =  nil , 
35+                     vendorExtensions:  [ String :  AnyCodable ]  =  [ : ] )  { 
2836            self . schema =  schema
2937            self . example =  example
3038            self . encoding =  encoding
39+             self . vendorExtensions =  vendorExtensions
3140        } 
3241    } 
3342} 
@@ -53,3 +62,93 @@ extension OpenAPI.Content {
5362        } 
5463    } 
5564} 
65+ 
66+ // MARK: - Codable
67+ 
68+ extension  OpenAPI . Content :  Encodable  { 
69+     public  func  encode( to encoder:  Encoder )  throws  { 
70+         var  container  =  encoder. container ( keyedBy:  CodingKeys . self) 
71+ 
72+         try . encode ( schema,  forKey:  . schema) 
73+ 
74+         if  example !=  nil  { 
75+             try . encode ( example,  forKey:  . example) 
76+         } 
77+ 
78+         if  encoding !=  nil  { 
79+             try . encode ( encoding,  forKey:  . encoding) 
80+         } 
81+ 
82+         if  vendorExtensions !=  [ : ]  { 
83+             for  (key,  value)  in  vendorExtensions { 
84+                 let  xKey  =  key. starts ( with:  " x- " )  ?  key :  " x- \( key) " 
85+                 try . encode ( value,  forKey:  . extended( xKey) ) 
86+             } 
87+         } 
88+     } 
89+ } 
90+ 
91+ extension  OpenAPI . Content :  Decodable  { 
92+     public  init ( from decoder:  Decoder )  throws  { 
93+         let  container  =  try . container ( keyedBy:  CodingKeys . self) 
94+ 
95+         schema =  try . decode ( Either < JSONReference < OpenAPI . Components ,  JSONSchema > ,  JSONSchema > . self,  forKey:  . schema) 
96+         example =  try . decodeIfPresent ( AnyCodable . self,  forKey:  . example) 
97+         encoding =  try . decodeIfPresent ( [ String :  Encoding ] . self,  forKey:  . encoding) 
98+ 
99+         let  decodedAny  =  ( try AnyCodable ( from:  decoder) ) . value as?  [ String :  Any ] 
100+ 
101+         vendorExtensions =  decodedAny? . filter  { 
102+             guard  let  key =  CodingKeys ( stringValue:  $0. key)  else  {  return  false  } 
103+ 
104+             return  !CodingKeys. allBuiltinCases. contains ( key) 
105+         } . mapValues ( AnyCodable . init)  ??  [ : ] 
106+     } 
107+ } 
108+ 
109+ extension  OpenAPI . Content  { 
110+     private  enum  CodingKeys :  CodingKey ,  Equatable  { 
111+         case  schema
112+         case  example
113+         case  encoding
114+         case  extended( String ) 
115+ 
116+         init ? ( stringValue:  String )  { 
117+             switch  stringValue { 
118+             case  " schema " : 
119+                 self  =  . schema
120+             case  " example " : 
121+                 self  =  . example
122+             case  " encoding " : 
123+                 self  =  . encoding
124+             default : 
125+                 self  =  . extended( stringValue) 
126+             } 
127+         } 
128+ 
129+         init ? ( intValue:  Int )  { 
130+             return  nil 
131+         } 
132+ 
133+         var  stringValue :  String  { 
134+             switch  self  { 
135+             case  . schema: 
136+                 return  " schema " 
137+             case  . example: 
138+                 return  " example " 
139+             case  . encoding: 
140+                 return  " encoding " 
141+             case  . extended( let  key) : 
142+                 return  key
143+             } 
144+         } 
145+ 
146+         var  intValue :  Int ? { 
147+             return  nil 
148+         } 
149+ 
150+         static  var  allBuiltinCases :  [ CodingKeys ]  { 
151+             return  [ . schema,  . example,  . encoding] 
152+         } 
153+     } 
154+ } 
0 commit comments