defmodule AshPaperTrail.ChangeBuilders.FullDiff.EmbeddedChange do import AshPaperTrail.ChangeBuilders.FullDiff.Helpers @moduledoc """ A simple attribute change will be represented as a map: %{ created: %{ subject: %{to: "subject"} } } %{ updated: %{ subject: %{from: "subject", to: "new subject"} } } %{ unchanged: %{ subject: %{unchanged: "subject"} } } %{ destroyed: %{ subject: %{unchanged: "subject"} } } """ def build(attribute, changeset) do dump_data_value(changeset, attribute) |> embedded_change_map() end def dump_data_value(changeset, attribute) do data_tuple = if changeset.action_type == :create do :not_present else case Ash.Changeset.get_data(changeset, attribute.name) do nil -> nil data -> dumped_data = dump_value(data, attribute) uid = unique_id(data, dumped_data) {uid, dumped_data} end end value_tuple = case Ash.Changeset.fetch_change(changeset, attribute.name) do {:ok, nil} -> nil {:ok, value} -> dumped_value = dump_value(value, attribute) uid = unique_id(value, dumped_value) {uid, dumped_value} :error -> :not_present end {data_tuple, value_tuple} end end