View Source Tyyppi.Struct (tyyppi v0.12.3)
Creates the typed struct with spec bound to each field.
usage
Usage
See Tyyppi.Example.Struct
for the example of why and how to use Tyyppi.Struct
.
example
Example
iex> defmodule MyStruct do
...> @type my_type :: :ok | {:error, term()}
...> Tyyppi.Struct.defstruct foo: atom(), bar: GenServer.on_start(), baz: my_type()
...> end
iex> types = MyStruct.types()
...> types[:foo]
%Tyyppi.T{
definition: {:type, 0, :atom, []},
module: nil,
name: nil,
params: [],
source: nil,
type: :built_in
}
...> types[:baz]
%Tyyppi.T{
definition: {:type, 0, :union, [
{:atom, 0, :ok},
{:type, 0, :tuple, [
{:atom, 0, :error}, {:type, 0, :term, []}]}]},
module: Test.Tyyppi.Struct.MyStruct,
name: :my_type,
params: [],
quoted: {{:., [], [Test.Tyyppi.Struct.MyStruct, :my_type]}, [], []},
source: :user_type,
type: :type
}
defaults
Defaults
Since there is no place for default values in the struct declaration, where types
are first class citizens, defaults might be specified through @defaults
module
attribute. Omitted fields there will be considered having nil
default value.
iex> %Tyyppi.Example.Struct{}
%Tyyppi.Example.Struct{
bar: {:ok, :erlang.list_to_pid('<0.0.0>')}, baz: {:error, :reason}, foo: nil}
upserts
Upserts
iex> {ex, pid} = {%Tyyppi.Example.Struct{}, :erlang.list_to_pid('<0.0.0>')}
iex> Tyyppi.Example.Struct.update(ex, foo: :foo, bar: {:ok, pid}, baz: :ok)
{:ok, %Tyyppi.Example.Struct{
bar: {:ok, :erlang.list_to_pid('<0.0.0>')},
baz: :ok,
foo: :foo}}
iex> Tyyppi.Example.Struct.update(ex, foo: :foo, bar: {:ok, pid}, baz: 42)
{:error, [baz: [type: [expected: "Tyyppi.Example.Struct.my_type()", got: 42]]]}
access
Access
iex> pid = :erlang.list_to_pid('<0.0.0>')
iex> ex = %Tyyppi.Example.Struct{foo: :foo, bar: {:ok, pid}, baz: :ok}
iex> put_in(ex, [:foo], :foo_sna)
%Tyyppi.Example.Struct{
bar: {:ok, :erlang.list_to_pid('<0.0.0>')},
baz: :ok,
foo: :foo_sna}
iex> put_in(ex, [:foo], 42)
** (ArgumentError) could not put/update key :foo with value 42 ([foo: [type: [expected: "atom()", got: 42]]])
Link to this section Summary
Functions
Declares a typed struct. The accepted argument is the keyword of
{field_name, type}
tuples. See Tyyppi.Example.Struct
for an example.
Puts the value to target under specified key, if passes validation, raises otherwise
Puts the value to target under specified key, if passes validation
Updates the value in target under specified key, if passes validation, raises otherwise
Updates the value in target under specified key, if passes validation
Link to this section Functions
Declares a typed struct. The accepted argument is the keyword of
{field_name, type}
tuples. See Tyyppi.Example.Struct
for an example.
@spec put!(target :: struct, key :: atom(), value :: any()) :: struct when struct: %{required(atom()) => any()}
Puts the value to target under specified key, if passes validation, raises otherwise
@spec put(target :: struct, key :: atom(), value :: any()) :: {:ok, struct} | {:error, keyword()} when struct: %{required(atom()) => any()}
Puts the value to target under specified key, if passes validation
@spec update!(target :: struct, key :: atom(), updater :: (any() -> any())) :: struct | no_return() when struct: %{__struct__: atom()}
Updates the value in target under specified key, if passes validation, raises otherwise
@spec update(target :: struct, key :: atom(), updater :: (any() -> any())) :: {:ok, struct} | {:error, any()} when struct: %{__struct__: atom()}
Updates the value in target under specified key, if passes validation