# README
OpenAPI structures for Go

This library provides Go structures to marshal/unmarshal and reflect OpenAPI Schema documents.
For automated HTTP REST service framework built with this library please check github.com/swaggest/rest
.
Features
- Type safe mapping of OpenAPI 3 documents with Go structures generated from schema.
- Type-based reflection of Go structures to OpenAPI 3.0 or 3.1 schema.
- Schema control with field tags
json
for request bodies and responses in JSONquery
,path
for parameters in URLheader
,cookie
,formData
,file
for other parametersform
acts asquery
andformData
contentType
indicates body content type- field tags named after JSON Schema/OpenAPI 3 Schema constraints
collectionFormat
to unpack slices from stringcsv
comma-separated values,ssv
space-separated values,pipes
pipe-separated values (|
),multi
ampersand-separated values (&
),json
additionally to slices unpacks maps and structs,
- Flexible schema control with
jsonschema-go
Example
reflector := openapi3.Reflector{}
reflector.Spec = &openapi3.Spec{Openapi: "3.0.3"}
reflector.Spec.Info.
WithTitle("Things API").
WithVersion("1.2.3").
WithDescription("Put something here")
type req struct {
ID string `path:"id" example:"XXX-XXXXX"`
Locale string `query:"locale" pattern:"^[a-z]{2}-[A-Z]{2}$"`
Title string `json:"string"`
Amount uint `json:"amount"`
Items []struct {
Count uint `json:"count"`
Name string `json:"name"`
} `json:"items"`
}
type resp struct {
ID string `json:"id" example:"XXX-XXXXX"`
Amount uint `json:"amount"`
Items []struct {
Count uint `json:"count"`
Name string `json:"name"`
} `json:"items"`
UpdatedAt time.Time `json:"updated_at"`
}
putOp, err := reflector.NewOperationContext(http.MethodPut, "/things/{id}")
handleError(err)
putOp.AddReqStructure(new(req))
putOp.AddRespStructure(new(resp), func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK })
putOp.AddRespStructure(new([]resp), func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusConflict })
reflector.AddOperation(putOp)
getOp, err := reflector.NewOperationContext(http.MethodGet, "/things/{id}")
handleError(err)
getOp.AddReqStructure(new(req))
getOp.AddRespStructure(new(resp), func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK })
reflector.AddOperation(getOp)
schema, err := reflector.Spec.MarshalYAML()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(schema))
Output:
openapi: 3.0.3
info:
description: Put something here
title: Things API
version: 1.2.3
paths:
/things/{id}:
get:
parameters:
- in: query
name: locale
schema:
pattern: ^[a-z]{2}-[A-Z]{2}$
type: string
- in: path
name: id
required: true
schema:
example: XXX-XXXXX
type: string
responses:
"200":
content:
application/json:
schema:
$ref: '#/components/schemas/Resp'
description: OK
put:
parameters:
- in: query
name: locale
schema:
pattern: ^[a-z]{2}-[A-Z]{2}$
type: string
- in: path
name: id
required: true
schema:
example: XXX-XXXXX
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Req'
responses:
"200":
content:
application/json:
schema:
$ref: '#/components/schemas/Resp'
description: OK
"409":
content:
application/json:
schema:
items:
$ref: '#/components/schemas/Resp'
type: array
description: Conflict
components:
schemas:
Req:
properties:
amount:
minimum: 0
type: integer
items:
items:
properties:
count:
minimum: 0
type: integer
name:
type: string
type: object
nullable: true
type: array
string:
type: string
type: object
Resp:
properties:
amount:
minimum: 0
type: integer
id:
example: XXX-XXXXX
type: string
items:
items:
properties:
count:
minimum: 0
type: integer
name:
type: string
type: object
nullable: true
type: array
updated_at:
format: date-time
type: string
type: object
# Functions
OperationCtx retrieves operation context from reflect context.
SanitizeMethodPath validates method and parses path element names.
WithContentType is a ContentUnit option.
WithCustomize is a ContentUnit option.
WithHTTPStatus is a ContentUnit option.
WithOperationCtx is a jsonschema.ReflectContext option.
WithReference is a ContentUnit option.
# Structs
ContentUnit defines HTTP content.
# Interfaces
ContentOrReference defines content entity that can be a reference.
ContentUnitPreparer defines self-contained ContentUnit.
JSONSchemaWalker can extract JSON schemas (for example, for validation purposes) from a ContentUnit.
OperationContext defines operation and processing state.
OperationInfo extends OperationContext with general information.
OperationInfoReader exposes current state of operation context.
OperationState extends OperationContext with processing state information.
Reflector defines OpenAPI reflector behavior.
RequestBodyEnforcer enables request body for GET and HEAD methods.
RequestJSONBodyEnforcer enables JSON request body for structures with `formData` tags.
SpecSchema abstracts OpenAPI schema implementation to generalize multiple revisions.
# Type aliases
ContentOption configures ContentUnit.
In defines value location in HTTP content.
JSONSchemaCallback is a user function called by JSONSchemaWalker.