Transformable v0.2.0 Transformable protocol

Transform arbitrary maps and keyword lists into structs.

Transformable is a wrapper around struct/2. Out of the box, it supports easily converting Maps and Keyword Lists into structs. Like with struct/2, only the keys in the struct will be pulled out of your initial data structure. Maps passed in can have either string or atom keys, but Transformable doesn't use the (unsafe) String.to_atom/1. Default values on the struct will be respected, or can be overriden.

Transformable is defined as a Protocol with implementations for Map and List. You can write your own implementation and use transform/2 to specify custom outputs.

Link to this section Summary

Functions

Takes a Map or Keyword List and a target, and transforms the former into the latter

Link to this section Types

Link to this section Functions

Link to this function

transform(entity, opts)

Takes a Map or Keyword List and a target, and transforms the former into the latter.

The target can be a struct or a module that exposes a struct. The target can also be a set of options to configure the transformation logic. Valid options are:

  • as - The transform target (struct or module)
  • default - Overrides the default value defined in the target struct with the value provided

Examples

# Our target
defmodule Tester do
  defstruct [:id, name: ""]
end

# The target is just a module alias
iex> Transformable.transform(%{id: 1}, Tester)
%Tester{id: 1, name: ""}

# The target is a struct
iex> Transformable.transform(%{id: 1}, %Tester{})
%Tester{id: 1, name: ""}

# With options, here we are overriding the struct defaults
iex> Transformable.transform(%{id: 1}, as: Tester, default: false)
%Tester{id: 1, name: false}

# The data to transform can also have string keys
iex> Transformable.transform(%{"id" => 1}, Tester)
%Tester{id: 1, name: ""}

# OR the data to transform can be a keyword list
iex> Transformable.transform([id: 1], Tester)
%Tester{id: 1, name: ""}