defmodule OpenAPI.State do
@moduledoc """
State for the overall code generation
This struct contains data that is passed between phases of the generation. It includes the
following fields:
* `call`: Information about the original call to the generator, including the configuration
profile and the spec files passed.
* `files`: After the render phase, contains a list of `t:OpenAPI.Renderer.File.t/0` structs
that were written.
* `operations`: After the process phase, contains a list of `t:OpenAPI.Processor.Operation.t/0`
structs that were processed.
* `schemas`: After the process phase, contains a map of schema references to their
`t:OpenAPI.Processor.Schema.t/0` structs. The reference-keyed map is included to make it
easier for render callbacks to look up a schema by its reference, as this is often how
operations will refer to them.
* `schema_specs_by_path`: After the read phase, contains a map of all schema specs keyed on
their base file and last referenced paths. This allows for easy lookup of schema specs from
`t:OpenAPI.Spec.ref/0` references.
* `spec`: After the read phase, contains the parsed and merged OpenAPI description(s).
All of this state is managed by the code generator between phases, and it is unlikely that a
callback would need to read or write to this struct directly.
"""
alias OpenAPI.Call
alias OpenAPI.Spec
@typedoc "OpenAPI generator state"
@type t :: %__MODULE__{
call: Call.t(),
files: [OpenAPI.Renderer.File.t()],
operations: [OpenAPI.Processor.Operation.t()],
schemas: %{reference => OpenAPI.Processor.Schema.t()},
schema_specs_by_path: %{Spec.full_path() => Spec.Schema.t()},
spec: Spec.t() | nil
}
@typedoc "Raw Yaml input."
@type yaml :: map | list
defstruct [
:call,
:files,
:operations,
:schemas,
:schema_specs_by_path,
:spec
]
@doc false
@spec new(Call.t()) :: t
def new(%Call{} = call) do
%__MODULE__{
call: call,
files: [],
operations: [],
schemas: %{},
schema_specs_by_path: %{},
spec: nil
}
end
end