ChangesetMerger v0.3.8 ChangesetMerger
A library to help you manipulate changes in your changeset with relative ease
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
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})
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"}
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"}
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"}
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"}