Spect v0.2.0 Spect

elixir typespec enhancements

Link to this section Summary

Functions

typespec-driven object decoding

decodes an object from a typespec, raising on error

Link to this section Functions

Link to this function to_spec(data, module, name \\ :t)
to_spec(data :: any(), module :: atom(), name :: atom()) ::
  {:ok, any()} | {:error, any()}

typespec-driven object decoding

This function converts a data structure into a new one derived from a type specification. This provides for the effective decoding of (nested) data structures from serialization formats that do not support Elixir’s rich set of types (json, etc.). Atoms can be decoded from strings, tuples from lists, structs from maps, etc.

data is the data structure to decode, module is the name of the module containing the type specification, and name is the name of the @type definition within the module (defaults to :t).

As mentioned above, a common use case is to decode a JSON document into an Elixir struct, for example using the poison parser:

    "test.json"
    |> File.read!()
    |> Poison.Parser.parse!()
    |> Spect.to_spec!(My.Master)

where the My module might contain the following structs:

    defmodule My do
      defmodule Master do
        @type t :: %__MODULE__{
          rest: integer(),
          details: %{String.t() => My.Detail.t()}
        }
        defstruct [rest: 2, details: %{}]
      end

      defmodule Detail do
        @type t :: %__MODULE__{
          nest: integer()
        }
        defstruct [nest: 1]
      end
    end
Link to this function to_spec!(data, module, name \\ :t)
to_spec!(data :: any(), module :: atom(), name :: atom()) :: any()

decodes an object from a typespec, raising on error