ChangesetMerger v0.3.9 ChangesetMerger View Source

A library to help you manipulate changes in your changeset with relative ease

Link to this section Summary

Functions

Changesets can run without a “changeset”, by passing a tuple containing both the data and the supported types as a tuple instead of a struct

Check for the field in the provided changeset, and if not found then set it ot the it based on the provide function

Derive a field from another field (or fields) based on the provided function. If the source field is not set, then do not do anything

Derive a field from another field (or fields) based on the provided function. only if the target field IS NOT set. If the source field is not set, then do not do anything

Force a field to be a certain value

Link to this section Functions

Changesets can run without a “changeset”, by passing a tuple containing both the data and the supported types as a tuple instead of a struct:

A convenience function to generate a changeset without a struct like %User{}.

ChangesetMerger.create(
  %{"first_name" => "Andrew"},
  %{first_name: :string, last_name: :string, email: :string})

If you want to seed the underlying mode, then use the &create/3 function

ChangesetMerger.create(
  %{"first_name" => "Normal Andrew"},
  %{"first_name" => "Super Andrew"},
  %{first_name: :string, last_name: :string, email: :string})
Link to this function create(record, params, types) View Source
Link to this function defaulted(changeset, field, default_if_missing) View Source

Check for the field in the provided changeset, and if not found then set it ot the it based on the provide function.

Examples

iex> ChangesetMerger.create(%{}, %{apples: :string})
...> |> ChangesetMerger.defaulted(:apples, "blue")
...> |> Map.get(:changes)
%{apples: "blue"}

iex> ChangesetMerger.create(%{apples: "red"}, %{}, %{apples: :string})
...> |> ChangesetMerger.defaulted(:apples, "blue")
...> |> Map.get(:changes)
%{}

iex> ChangesetMerger.create(%{"apples" => "red"}, %{apples: :string})
...> |> ChangesetMerger.defaulted(:apples, "blue")
...> |> Map.get(:changes)
%{apples: "red"}
Link to this function derive(changeset, field, fun) View Source

Derive a field from another field (or fields) based on the provided function. If the source field is not set, then do not do anything.

Examples

iex> ChangesetMerger.create(%{}, %{apples: :string})
...> |> ChangesetMerger.derive(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{}

iex> ChangesetMerger.create(%{"apples" => "green"}, %{apples: :string})
...> |> ChangesetMerger.derive(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{apples: "green", oranges: "neerg"}

iex> ChangesetMerger.create(%{apples: "green"}, %{}, %{apples: :string})
...> |> ChangesetMerger.derive(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{oranges: "neerg"}

iex> ChangesetMerger.create(%{apples: "green", oranges: "neerg"}, %{}, %{apples: :string})
...> |> ChangesetMerger.derive(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{}

iex> ChangesetMerger.create(%{"apples" => "green", "bananas" => "blue"}, %{apples: :string, bananas: :string})
...> |> ChangesetMerger.derive([:apples, :bananas], :oranges, fn([a,b]) -> a <> b end)
...> |> Map.get(:changes)
%{apples: "green", bananas: "blue", oranges: "greenblue"}

iex> ChangesetMerger.create(%{"apples" => "green"}, %{apples: :string})
...> |> ChangesetMerger.derive(:apples, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{apples: "neerg"}

iex> ChangesetMerger.create(%{"apples" => "green", "oranges" => "blue"}, %{apples: :string, oranges: :string})
...> |> ChangesetMerger.derive(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{apples: "green", oranges: "neerg"}
Link to this function derive(changeset, from_field_or_fields, to_field, fun) View Source
Link to this function derive_if_missing(changeset, from_field_or_fields, to_field, fun) View Source

Derive a field from another field (or fields) based on the provided function. only if the target field IS NOT set. If the source field is not set, then do not do anything.

Examples

iex> ChangesetMerger.create(%{}, %{apples: :string})
...> |> ChangesetMerger.derive_if_missing(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{}

iex> ChangesetMerger.create(%{"apples" => "green", "bananas" => "blue"}, %{apples: :string, bananas: :string})
...> |> ChangesetMerger.derive_if_missing([:apples, :bananas], :oranges, fn([a,b]) -> a <> b end)
...> |> Map.get(:changes)
%{apples: "green", bananas: "blue", oranges: "greenblue"}

iex> ChangesetMerger.create(%{"apples" => "green"}, %{apples: :string})
...> |> ChangesetMerger.derive_if_missing(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{apples: "green", oranges: "neerg"}

iex> ChangesetMerger.create(%{"apples" => "green", "oranges" => "blue"}, %{apples: :string, oranges: :string})
...> |> ChangesetMerger.derive_if_missing(:apples, :oranges, fn(x) -> String.reverse(x) end)
...> |> Map.get(:changes)
%{apples: "green", oranges: "blue"}

iex> ChangesetMerger.create(%{"apples" => "green", "bananas" => "blue", "oranges" => "purple"}, %{apples: :string, bananas: :string, oranges: :string})
...> |> ChangesetMerger.derive_if_missing([:apples, :bananas], :oranges, fn([a,b]) -> a <> b end)
...> |> Map.get(:changes)
%{apples: "green", bananas: "blue", oranges: "purple"}
Link to this function force(changeset, field, val) View Source

Force a field to be a certain value.

Examples

iex> ChangesetMerger.create(%{}, %{apples: :string})
...> |> ChangesetMerger.force(:apples, "blue")
...> |> Map.get(:changes)
%{apples: "blue"}


iex> ChangesetMerger.create(%{"apples" => "green"}, %{apples: :string})
...> |> ChangesetMerger.force(:apples, "blue")
...> |> Map.get(:changes)
%{apples: "blue"}