Documentation
¶
Overview ¶
Package edit provides structural edits to an OpenAPI document — changes where touching one place obliges you to touch several others.
Index ¶
- Constants
- Variables
- func CountReferences(doc *openapi.Document) map[string]int
- func DescribeReferences(doc *openapi.Document, descriptions map[string]string) error
- func ExtractSchema(doc *openapi.Document, name string, match func(*openapi.Schema) bool) error
- func RedirectSchema(doc *openapi.Document, oldName, newName, description string) error
- func RedirectSchemas(doc *openapi.Document, to map[string]string) error
- func RemoveUnreferenced(doc *openapi.Document, names ...string) []string
- func RenameSchema(doc *openapi.Document, oldName, newName string) error
- func RenameSchemas(doc *openapi.Document, to map[string]string) error
- func TrimExample(v jsontext.Value, maxItems int) (jsontext.Value, error)
- func TrimSchemaExamples(doc *openapi.Document, maxItems int) error
- type ErrInvalidSchemaName
- type ErrSchemaExists
- type ErrSchemaNotFound
Constants ¶
const DefaultMaxArrayExamples = 3
DefaultMaxArrayExamples is the array length TrimExample and TrimSchemaExamples use when the caller passes 0 for maxItems.
Variables ¶
var ErrNoMatch = errors.New("no inline schema matches")
ErrNoMatch is returned when no inline schema matches, so there is nothing to extract.
Functions ¶
func CountReferences ¶
CountReferences counts the references to each schema in components.schemas, wherever in the document they occur. A schema nothing refers to is not in the result.
func DescribeReferences ¶
DescribeReferences gives every reference to a schema in descriptions the description listed for it, beside the $ref, unless the reference has a description of its own already.
A description says what a schema is used for in one place. Before schemas that describe the same shape are consolidated onto one, describing the references to each keeps what each meant where it was used.
It fails, changing nothing, if a name in descriptions is not in components.schemas (ErrSchemaNotFound).
func ExtractSchema ¶
ExtractSchema moves the inline schemas match accepts into components.schemas, as one schema called name, and replaces each with a reference to it.
The first schema match accepts, in the order the document holds them, becomes the component, so match should accept only schemas that are the same: every one it accepts is replaced, and what set the others apart is lost. Only their descriptions are kept, on the references that replace them, since a description says what a schema is used for there, not what it is.
The schemas already in components.schemas are not inline, so match is never asked about them. It is asked about schemas within them, and anywhere else in the document. A schema it accepts inside another it accepts is part of that one, and moves into the component with it, rather than becoming a reference to the component itself.
It fails, changing nothing, if name is already taken (ErrSchemaExists), could not be referenced (ErrInvalidSchemaName), or if match accepts no schema (ErrNoMatch).
func RedirectSchema ¶
RedirectSchema repoints every reference to oldName at newName and removes oldName from components.schemas. It does not read or change either schema's own definition — newName's shape is left exactly as it was, and oldName's is discarded along with oldName itself, not merged into newName's. Combining two schemas' definitions into one wider shape is a distinct, unrelated operation; see openapi-merge for that.
It differs from RenameSchema, which refuses to rename a schema onto a name that already exists (ErrSchemaExists): redirecting onto an existing schema is exactly the point here, typically because several near-duplicate schemas (e.g. ones an OpenAPI generator produced one per endpoint, that happen to describe the same thing) are being consolidated onto one of them.
If description is non-empty, it becomes the $ref-level description on every reference this repoints, replacing whatever description that reference already had. The usual reason to set it is that oldName's own definition — its bounds, its wording — is about to be discarded once oldName is gone; setting description is how that information survives on the references that used it, rather than being lost along with oldName.
A oneOf or anyOf that listed both schemas lists newName twice afterwards, so it keeps only the first of those plain references: a value matching one would match the other, and a oneOf could never hold for it.
It fails, changing nothing, if oldName or newName is not in components.schemas (ErrSchemaNotFound).
func RedirectSchemas ¶
RedirectSchemas is RedirectSchema for many schemas at once: it repoints every reference to each key of to at that key's value, and removes the keys from components.schemas.
It walks the document a fixed number of times however many schemas it redirects, where calling RedirectSchema for each would walk it once per schema.
A key redirected onto itself is left alone. Otherwise it fails, changing nothing, if a key or a value is not in components.schemas, or if a value is itself redirected and so would not be there afterwards (ErrSchemaNotFound).
func RemoveUnreferenced ¶
RemoveUnreferenced removes those of the schemas names from components.schemas that nothing in doc refers to, and returns the ones it removed. A schema a discriminator's mapping names is referred to, as much as by a $ref.
It repeats until each of names that remains is referred to, since removing one can leave another without a reference. A schema not among names stays, referred to or not: a specification may define one only to document it.
func RenameSchema ¶
RenameSchema renames a schema in components.schemas and rewrites every reference to it, wherever in the document that reference occurs.
The schema keeps its position among the components, so renaming produces a one-line change rather than reordering the section.
Renaming a schema to its current name does nothing and reports no error. Otherwise it fails, changing nothing, if:
- oldName is not in components.schemas (ErrSchemaNotFound);
- newName is already taken (ErrSchemaExists) — renaming onto an existing schema would silently discard one of two different definitions, and point every reference to whichever survived;
- newName could not be referenced (ErrInvalidSchemaName).
func RenameSchemas ¶
RenameSchemas is RenameSchema for many schemas at once: it renames each key of to that key's value, and rewrites every reference to it.
The renames happen together, so a new name may be one another key is giving up, and two schemas can swap names. It walks the document a fixed number of times however many schemas it renames, where calling RenameSchema for each would walk it once per schema.
It fails, changing nothing, for the reasons RenameSchema does, and with ErrSchemaExists when two keys would take the same new name.
func TrimExample ¶
TrimExample returns v with every array it contains, at any depth, cut down to at most maxItems elements. Object key order and every kept value's own bytes are preserved exactly; only arrays are shortened. If maxItems is 0, DefaultMaxArrayExamples is used.
Elements are chosen to be representative rather than just the first few: an array keeps one element per distinct shape it observes first — an object's own set of keys, or a scalar's JSON type — in the order they appear, before repeating one to fill the rest of the budget. A field only some elements carry, or a value that is sometimes a number and sometimes a string, therefore survives trimming instead of being cut away by chance.
v must be well-formed JSON; TrimExample returns an error otherwise.
func TrimSchemaExamples ¶
TrimSchemaExamples applies TrimExample to every schema's own Example reachable from doc, in place. If maxItems is 0, DefaultMaxArrayExamples is used.
Types ¶
type ErrInvalidSchemaName ¶
type ErrInvalidSchemaName struct{ Name string }
ErrInvalidSchemaName is returned when the new name is not a valid key under components, and so could not be referenced.
func (*ErrInvalidSchemaName) Error ¶
func (e *ErrInvalidSchemaName) Error() string
type ErrSchemaExists ¶
type ErrSchemaExists struct{ Name string }
ErrSchemaExists is returned when the new name is already taken by another schema. Renaming onto it would silently merge two definitions into one.
func (*ErrSchemaExists) Error ¶
func (e *ErrSchemaExists) Error() string
type ErrSchemaNotFound ¶
type ErrSchemaNotFound struct{ Name string }
ErrSchemaNotFound is returned when the schema to rename is not in components.schemas.
func (*ErrSchemaNotFound) Error ¶
func (e *ErrSchemaNotFound) Error() string