Help us shape the future of Go! Take the 2026 Go Developer Survey

openapi

package
v0.17.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 29, 2026 License: AGPL-3.0 Imports: 19 Imported by: 0

Documentation

Overview

Package openapi writes Pando's HTTP API as an OpenAPI 3.1 document, read from the handlers that serve it.

R-261 makes the API the product, and a description of it written by hand is a second opinion about it that drifts the first time a field is added. So nothing here is written by hand except what the code cannot say (see overrides.go). The routes are the router's: (*httpapi.Server).Routes is read as source, so a route is described because it is registered. Each route's request body is the type its handler decodes into; each response is what its handler passes to JSON, with the status it passes — a map literal's keys are read from the literal, and a struct is described field by field the way encoding/json writes it, as cmd/gen-api-types describes it for the console. The summaries, groups and verbs are httpapi's routeDocs, the table TestR261_EveryRouteIsDocumented holds to the router.

It reads source, so it runs where the source is: `make reference` writes docs/openapi.json with it, and the binary does not carry it.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Generate

func Generate(doc reference.Document, version string) ([]byte, error)

Generate reads the handlers and writes the document. It fails, naming each one, when a route has an answer it could not read: a document that guessed would be the hand-written second opinion this exists to avoid.

Types

type Components

type Components struct {
	Schemas         map[string]*Schema        `json:"schemas"`
	Responses       map[string]*Response      `json:"responses"`
	SecuritySchemes map[string]SecurityScheme `json:"securitySchemes"`
}

Components are the document's shared parts.

type Document

type Document struct {
	OpenAPI    string                           `json:"openapi"`
	Info       Info                             `json:"info"`
	Servers    []Server                         `json:"servers"`
	Security   []map[string][]string            `json:"security"`
	Tags       []Tag                            `json:"tags"`
	Paths      map[string]map[string]*Operation `json:"paths"`
	Components Components                       `json:"components"`
}

Document is an OpenAPI 3.1 document.

type Header struct {
	Description string  `json:"description,omitempty"`
	Schema      *Schema `json:"schema"`
}

Header is a response header.

type Info

type Info struct {
	Title       string `json:"title"`
	Version     string `json:"version"`
	Description string `json:"description"`
}

Info is the document's title and version.

type MediaType

type MediaType struct {
	Schema *Schema `json:"schema"`
}

MediaType is a body in one content type.

type Operation

type Operation struct {
	OperationID string                 `json:"operationId"`
	Summary     string                 `json:"summary"`
	Description string                 `json:"description,omitempty"`
	Tags        []string               `json:"tags"`
	Parameters  []Parameter            `json:"parameters,omitempty"`
	RequestBody *RequestBody           `json:"requestBody,omitempty"`
	Responses   map[string]*Response   `json:"responses"`
	Security    *[]map[string][]string `json:"security,omitempty"`
	Verb        string                 `json:"x-pando-verb,omitempty"`
}

Operation is one method on one path.

type Parameter

type Parameter struct {
	Name        string  `json:"name"`
	In          string  `json:"in"`
	Required    bool    `json:"required,omitempty"`
	Description string  `json:"description,omitempty"`
	Schema      *Schema `json:"schema"`
}

Parameter is a path, query or header parameter.

type Prop

type Prop struct {
	Name   string
	Schema *Schema
}

Prop is one property, kept in declaration order.

type Props

type Props []Prop

Props marshals as a JSON object in the order the fields are declared, which is the order the Go struct writes them and the order a person reads them in.

func (Props) MarshalJSON

func (p Props) MarshalJSON() ([]byte, error)

MarshalJSON writes the properties as an object, in order.

type RequestBody

type RequestBody struct {
	Description string               `json:"description,omitempty"`
	Required    bool                 `json:"required,omitempty"`
	Content     map[string]MediaType `json:"content"`
}

RequestBody is what an operation reads.

type Response

type Response struct {
	Ref         string               `json:"$ref,omitempty"`
	Description string               `json:"description,omitempty"`
	Headers     map[string]Header    `json:"headers,omitempty"`
	Content     map[string]MediaType `json:"content,omitempty"`
}

Response is one answer.

type Schema

type Schema struct {
	// Ref is a component's internal key while the document is assembled, and
	// "#/components/schemas/<name>" once names are settled.
	Ref                  string    `json:"$ref,omitempty"`
	Type                 any       `json:"type,omitempty"`
	Format               string    `json:"format,omitempty"`
	ContentEncoding      string    `json:"contentEncoding,omitempty"`
	Description          string    `json:"description,omitempty"`
	Enum                 []string  `json:"enum,omitempty"`
	Items                *Schema   `json:"items,omitempty"`
	Properties           Props     `json:"properties,omitempty"`
	Required             []string  `json:"required,omitempty"`
	AdditionalProperties *Schema   `json:"additionalProperties,omitempty"`
	AnyOf                []*Schema `json:"anyOf,omitempty"`
	OneOf                []*Schema `json:"oneOf,omitempty"`
	// contains filtered or unexported fields
}

Schema is a JSON Schema as OpenAPI 3.1 has it: the subset this generator writes, in the order a reader expects the keys.

type SecurityScheme

type SecurityScheme struct {
	Type        string `json:"type"`
	Scheme      string `json:"scheme,omitempty"`
	In          string `json:"in,omitempty"`
	Name        string `json:"name,omitempty"`
	Description string `json:"description,omitempty"`
}

SecurityScheme is one way to authenticate.

type Server

type Server struct {
	URL         string                    `json:"url"`
	Description string                    `json:"description"`
	Variables   map[string]ServerVariable `json:"variables"`
}

Server is where the API is reached.

type ServerVariable

type ServerVariable struct {
	Default     string `json:"default"`
	Description string `json:"description"`
}

ServerVariable is a part of a server's URL the reader fills in.

type Tag

type Tag struct {
	Name string `json:"name"`
}

Tag is a group of operations.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL