请参阅父库:https://github.com/mattpolzin/OpenAPIKit。
要生成 OpenAPI 3.1.x 类型,请使用 OpenAPIReflection
模块。要生成 OpenAPI 3.0.x 类型,请使用 OpenAPIReflection30
模块。
此库为从 Swift 类型创建 OpenAPI 类型提供扩展支持。具体来说,此库涵盖了 Swift 类型的一个子集,这些类型需要 JSONEncoder
来对类型的 JSONSchema
进行有根据的猜测,或将任意类型转换为 AnyCodable
,以便用作模式示例或允许的值。
日期将根据传递到模式构造方法中的 JSONEncoder
的编码设置创建不同的 OpenAPI 表示形式。
// encoder1 has `.iso8601` `dateEncodingStrategy`
let schema = Date().dateOpenAPISchemaGuess(using: encoder1)
// ^ equivalent to:
let sameSchema = JSONSchema.string(
format: .dateTime
)
// encoder2 has `.secondsSince1970` `dateEncodingStrategy`
let schema2 = Date().dateOpenAPISchemaGuess(using: encoder2)
// ^ equivalent to:
let sameSchema = JSONSchema.number(
format: .double
)
即使给定自定义格式化程序日期解码策略,它也会尝试进行猜测。
只要 Swift 枚举符合 CaseIterable
、Encodable
和 AnyJSONCaseIterable
(最后一个是前两者的自然结果),它们就会生成指定了允许值的模式。
enum CodableEnum: String, CaseIterable, AnyJSONCaseIterable, Codable {
case one
case two
}
let schema = CodableEnum.caseIterableOpenAPISchemaGuess(using: JSONEncoder())
// ^ equivalent, although not equatable, to:
let sameSchema = JSONSchema.string(
allowedValues: "one", "two"
)
只要 Swift 结构体符合 Sampleable
和 Encodable
,它们就会生成最佳猜测模式。
struct Nested: Encodable, Sampleable {
let string: String
let array: [Int]
// `Sampleable` just enables mirroring, although you could use it to produce
// OpenAPI examples as well.
static let sample: Self = .init(
string: "",
array: []
)
}
let schema = Nested.genericOpenAPISchemaGuess(using: JSONEncoder())
// ^ equivalent and indeed equatable to:
let sameSchema = JSONSchema.object(
properties: [
"string": .string,
"array": .array(items: .integer)
]
)
您可以利用此库和 OpenAPIKit 提供的协议,从您自己的 Swift 类型创建任意复杂的 OpenAPI 类型。目前,关于此主题的唯一文档形式是在 JSONAPI+OpenAPI 库中完全实现的示例。只需查找对 OpenAPISchemaType
和 OpenAPIEncodedSchemaType
的遵循。