croma v0.4.6 Croma.TypeGen

Module that defines macros for ad-hoc module definitions.

Croma leverages Elixir’s lightweight module syntax and advocate coding styles to define many modules. Macros in this module helps defining modules in an ad-hoc way (in other words “in-line”) based on existing modules.

Summary

Macros

Creates a new module that simply represents a type whose sole member is the given value

An ad-hoc version of Croma.SubtypeOfList. Options for Croma.SubtypeOfList are not available in list_of/1. Usage of list_of/1 macro is the same as nilable/1

Creates a new module that represents a nilable type, based on the given module module

Creates a new module that represents a sum type of the given types

Macros

fixed(value)

Creates a new module that simply represents a type whose sole member is the given value.

Only atoms and integers are supported.

list_of(mod)

An ad-hoc version of Croma.SubtypeOfList. Options for Croma.SubtypeOfList are not available in list_of/1. Usage of list_of/1 macro is the same as nilable/1.

nilable(mod)

Creates a new module that represents a nilable type, based on the given module module.

The module passed to nilable/1 must define the following members:

  • @type t
  • @spec validate(term) :: Croma.Result.t(t)

Using the above members nilable/1 generates a new module that also defines the same members:

  • @type t :: nil | module.t
  • @spec validate(term) :: Croma.Result.t(t)

Examples

iex> use Croma
...> defmodule I do
...>   use Croma.SubtypeOfInt, min: 0
...> end

This is useful in defining a struct with nilable fields using Croma.Struct.

...> defmodule S do
...>   use Croma.Struct, fields: [not_nilable_int: I, nilable_int: Croma.TypeGen.nilable(I)]
...> end

...> S.new([not_nilable_int: 0, nilable_int: nil])
%S{nilable_int: nil, not_nilable_int: 0}
union(modules)

Creates a new module that represents a sum type of the given types.

The argument must be a list of modules each of which defines @type t and @spec validate(term) :: Croma.Result.t(t).