# ExCraft

Helper tool to define Elixir structures and constructors.

- Gives some compile-time control of types, required, default and enforced values.
- Generates constructor `&new/1` for your data structure.

# Usage

  Define your structures like a BOSS:

  defmodule ExCraft.Car do
    require ExCraft
    ExCraft.craft [
      %ExCraft.Field{name: :brand,  type: :string,        required: false,   default: "custom",  enforce: false},
      %ExCraft.Field{name: :year,   type: :pos_integer,   required: true,    default: nil,       enforce: true},
      %ExCraft.Field{name: :used,   type: :boolean,       required: false,   default: true,      enforce: false},

# Examples

  Use structure as is, or use `&new/1` constructor to perform some
  implicit types conversions and checks. It's very useful
  in Phoenix plugs/controllers because request parameters are usually passed
  as maps with strings as keys and values.

  iex> alias ExCraft.Car
  iex> %Car{year: 1990}
  %Car{brand: "custom", used: true, year: 1990}
  iex>{"year" => "1990"})
  %Car{brand: "custom", used: true, year: 1990}
  iex>{year: "1990"})
  %Car{brand: "custom", used: true, year: 1990}
  iex>[year: "1990"])
  %Car{brand: "custom", used: true, year: 1990}
  iex>{"year" => 1990.0})
  %Car{brand: "custom", used: true, year: 1990}
  iex>{brand: "custom", used: true, year: 1990})
  %Car{brand: "custom", used: true, year: 1990}
  iex>{"year" => "1990.1"})
  ** (RuntimeError) Elixir.ExCraft.Car ExCraft error. Type of "1990.1" is not pos_integer. Error in field %ExCraft.Field{default: nil, enforce: true, name: :year, required: true, type: :pos_integer} of data source %{"year" => "1990.1"}.

# Types

  List of available types.



- add typespec generator
- add &new/1 macro that defines only constructor
- add macro to create constructor for Ecto model