Skip to content

mattpolzin/OpenAPIReflection

Repository files navigation

Swift 5.8+

MIT licenseTests

OpenAPI support

See parent library at https://github.com/mattpolzin/OpenAPIKit.

To generate OpenAPI 3.1.x types, use the OpenAPIReflection module. To generate OpenAPI 3.0.x types, use the OpenAPIReflection30 module.

OpenAPIReflection

This library offers extended support for creating OpenAPI types from Swift types. Specifically, this library covers the subset of Swift types that require a JSONEncoder to either make an educated guess at the JSONSchema for the type or to turn arbitrary types into AnyCodable for use as schema examples or allowed values.

Dates

Dates will create different OpenAPI representations depending on the encoding settings of the JSONEncoder passed into the schema construction method.

// encoder1 has `.iso8601` `dateEncodingStrategy` letschema=Date().dateOpenAPISchemaGuess(using: encoder1) // ^ equivalent to: letsameSchema=JSONSchema.string( format:.dateTime ) // encoder2 has `.secondsSince1970` `dateEncodingStrategy` letschema2=Date().dateOpenAPISchemaGuess(using: encoder2) // ^ equivalent to: letsameSchema=JSONSchema.number( format:.double )

It will even try to take a guess given a custom formatter date decoding strategy.

Enums

Swift enums produce schemas with allowed values specified as long as they conform to CaseIterable, Encodable, and AnyJSONCaseIterable (the last of which is free given the former two).

enumCodableEnum:String,CaseIterable,AnyJSONCaseIterable,Codable{case one case two }letschema=CodableEnum.caseIterableOpenAPISchemaGuess(using:JSONEncoder()) // ^ equivalent, although not equatable, to: letsameSchema=JSONSchema.string( allowedValues:"one","two")

Structs

Swift structs produce a best-guess schema as long as they conform to Sampleable and Encodable

structNested:Encodable,Sampleable{letstring:Stringletarray:[Int] // `Sampleable` just enables mirroring, although you could use it to produce // OpenAPI examples as well. staticletsample:Self=.init( string:"", array:[])}letschema=Nested.genericOpenAPISchemaGuess(using:JSONEncoder()) // ^ equivalent and indeed equatable to: letsameSchema=JSONSchema.object( properties:["string":.string,"array":.array(items:.integer)])

Custom OpenAPI type representations

You can take the protocols offered by this library and OpenAPIKit and create arbitrarily complex OpenAPI types from your own Swift types. Right now, the only form of documentation on this subject is the fully realized example over in the JSONAPI+OpenAPI library. Just look for conformances to OpenAPISchemaType and OpenAPIEncodedSchemaType.

About

Additional support for turning Swift Types into OpenAPISchema

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages