Tyyppi.Example.Struct (tyyppi v0.10.0) View Source

Example of the structure defined with Tyyppi.Struct.defstruct/1

The original code of this module follows:

use Tyyppi

@typedoc "The user type defined before `defstruct/1` declaration"
@type my_type :: :ok | {:error, term()}

@defaults bar: {:ok, :erlang.list_to_pid('<0.0.0>')}, baz: {:error, :reason}
defstruct foo: nil | atom(), bar: GenServer.on_start(), baz: my_type()

defp cast_baz(true), do: :ok
defp cast_baz(false), do: {:error, false}
defp cast_baz(value), do: value

Usage examples

iex> put_in(%Tyyppi.Example.Struct{}, [:foo], :ok)
%Tyyppi.Example.Struct{
  bar: {:ok, :erlang.list_to_pid('<0.0.0>')},
  baz: {:error, :reason},
  foo: :ok}
iex> put_in(%Tyyppi.Example.Struct{}, [:foo], 42)
** (ArgumentError) could not put/update key :foo with value 42 ([foo: [type: [expected: "atom()", got: 42]]])
iex> put_in(%Tyyppi.Example.Struct{}, [:baz], true)
%Tyyppi.Example.Struct{
  bar: {:ok, :erlang.list_to_pid('<0.0.0>')},
  baz: :ok,
  foo: nil}
iex> put_in(%Tyyppi.Example.Struct{}, [:baz], false)
%Tyyppi.Example.Struct{
  bar: {:ok, :erlang.list_to_pid('<0.0.0>')},
  baz: {:error, false},
  foo: nil}

Link to this section Summary

Types

The user type defined before defstruct/1 declaration

t()

The type describing this struct. This type will be used to validate upserts when called via Access and/or Tyyppi.Struct.put/3, Tyyppi.Struct.update/3, both delegating to generated Tyyppi.Example.Struct.update/2.

Functions

Helper guard to match instances of struct Tyyppi.Value

Returns the field types of this struct as keyword of {field :: atom, type :: Tyyppi.T.t(term())} pairs.

Updates the struct

This function is supposed to be overwritten in the implementation in cases when custom validation is required.

Link to this section Types

Specs

my_type() :: :ok | {:error, term()}

The user type defined before defstruct/1 declaration

Specs

t() :: %Tyyppi.Example.Struct{
  foo: atom(),
  bar: GenServer.on_start(),
  baz: my_type()
}

The type describing this struct. This type will be used to validate upserts when called via Access and/or Tyyppi.Struct.put/3, Tyyppi.Struct.update/3, both delegating to generated Tyyppi.Example.Struct.update/2.

Upon insertion, the value will be coerced to the expected type when available, the type itself will be validated, and then the custom validation will be applied when applicable.

Link to this section Functions

Specs

as_value(keyword()) :: Tyyppi.Value.t({:any, [], []})

Factory for Elixir.Tyyppi.Example.Struct wrapped by Tyyppi.Value

Link to this macro

is_value(value)

View Source (macro) (since 0.9.0)

Helper guard to match instances of struct Tyyppi.Value

Specs

types() :: [{atom(), Tyyppi.T.t(wrapped)}] when wrapped: term()

Returns the field types of this struct as keyword of {field :: atom, type :: Tyyppi.T.t(term())} pairs.

Specs

update(target :: t(), values :: keyword()) :: {:ok, t()} | {:error, keyword()}

Updates the struct

Specs

validate(t()) :: Tyyppi.Valuable.either()

This function is supposed to be overwritten in the implementation in cases when custom validation is required.

It would be called after all casts and type validations, if the succeeded