Current section

Files

Jump to
oapi_generator lib open_api generator field.ex
Raw

lib/open_api/generator/field.ex

defmodule OpenAPI.Generator.Field do
@moduledoc false
alias OpenAPI.Generator.Typing
alias OpenAPI.Spec
alias OpenAPI.State
@type t :: %__MODULE__{
name: String.t(),
nullable: boolean,
private: boolean,
required: boolean,
type: Typing.t()
}
defstruct name: nil,
nullable: false,
private: false,
required: true,
type: nil
@doc """
Create a list of Fields based on the properties of the given `schema`.
See `Typing.schema_to_type/3` for more information about available options.
"""
@spec list_from_spec(State.t(), Spec.Schema.t(), keyword) :: [t]
def list_from_spec(state, schema, opts \\ [])
def list_from_spec(state, %Spec.Schema{properties: properties, required: required}, opts) do
properties =
Enum.map(properties, fn {field_name, %Spec.Schema{nullable: nullable?} = schema} ->
required? = is_list(required) and field_name in required
%__MODULE__{
name: field_name,
nullable: nullable?,
required: required?,
type: Typing.schema_to_type(state, schema, opts)
}
end)
properties ++ extra_fields(state)
end
@spec extra_fields(State.t()) :: [t]
defp extra_fields(%State{config: %OpenAPI.Config{extra_fields: nil}}), do: []
defp extra_fields(%State{config: %OpenAPI.Config{extra_fields: extra_fields}}) do
Enum.map(extra_fields, fn {field_name, type} ->
%__MODULE__{
name: to_string(field_name),
nullable: false,
private: true,
required: true,
type: type
}
end)
end
end