defmodule Zig.Type.Optional do
@moduledoc false
alias Zig.Type
use Type
defstruct [:child]
@type t :: %__MODULE__{child: Type.t()}
def from_json(%{"child" => child}, module) do
%__MODULE__{child: Type.from_json(child, module)}
end
@impl true
def get_allowed?(optional), do: Type.get_allowed?(optional.child)
@impl true
def make_allowed?(optional), do: Type.make_allowed?(optional.child)
@impl true
def in_out_allowed?(optional), do: Type.in_out_allowed?(optional.child)
@impl true
def binary_size(optional), do: Type.binary_size(optional.child)
@impl true
def render_zig(optional), do: "?#{Type.render_zig(optional.child)}"
@impl true
def render_accessory_variables(_, _, _), do: Type._default_accessory_variables()
@impl true
def payload_options(_, _), do: Type._default_payload_options()
@impl true
def marshal_param(_, variable, _, platform), do: Type._default_marshal_param(platform, variable)
@impl true
def marshal_return(_, variable, platform), do: Type._default_marshal_return(platform, variable)
# TODO: optional multipointer
@impl true
def render_cleanup(_type, _index), do: Type._default_cleanup()
@impl true
def render_elixir_spec(optional, context) do
quote do
unquote(Type.render_elixir_spec(optional.child, context)) | nil
end
end
def of(child), do: %__MODULE__{child: child}
end