diff --git a/lib/diffo/provider/assigner/assigner.ex b/lib/diffo/provider/assigner/assigner.ex index 583ad59..1867cca 100644 --- a/lib/diffo/provider/assigner/assigner.ex +++ b/lib/diffo/provider/assigner/assigner.ex @@ -208,8 +208,14 @@ defmodule Diffo.Provider.Assigner do {_free, updated} = Map.get_and_update(assignable_value, :free, fn free -> {free - 1, free - 1} end) - {:ok, new_struct} = Ash.Type.cast_input(AssignableValue, Map.from_struct(updated), AssignableValue.subtype_constraints()) - new_value = Value.dynamic(AssignableValue, new_struct) + {:ok, new_struct} = + Ash.Type.cast_input( + AssignableValue, + Map.from_struct(updated), + AssignableValue.subtype_constraints() + ) + + new_value = Value.dynamic(new_struct) case Diffo.Provider.update_characteristic(characteristic, %{value: new_value}) do {:ok, _characteristic} -> @@ -229,8 +235,14 @@ defmodule Diffo.Provider.Assigner do {_free, updated} = Map.get_and_update(assignable_value, :free, fn free -> {free + 1, free + 1} end) - {:ok, new_struct} = Ash.Type.cast_input(AssignableValue, Map.from_struct(updated), AssignableValue.subtype_constraints()) - new_value = Value.dynamic(AssignableValue, new_struct) + {:ok, new_struct} = + Ash.Type.cast_input( + AssignableValue, + Map.from_struct(updated), + AssignableValue.subtype_constraints() + ) + + new_value = Value.dynamic(new_struct) case Diffo.Provider.update_characteristic(characteristic, %{value: new_value}) do {:ok, _characteristic} -> diff --git a/lib/diffo/provider/components/instance/extension/characteristic.ex b/lib/diffo/provider/components/instance/extension/characteristic.ex index b514c4f..fac242d 100644 --- a/lib/diffo/provider/components/instance/extension/characteristic.ex +++ b/lib/diffo/provider/components/instance/extension/characteristic.ex @@ -48,7 +48,7 @@ defmodule Diffo.Provider.Instance.Characteristic do Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc -> try do - value = Value.dynamic(value_type, struct(value_type)) + value = Value.dynamic(struct(value_type)) case Provider.create_characteristic(%{name: name, type: type, value: value}) do {:ok, result} -> @@ -110,7 +110,7 @@ defmodule Diffo.Provider.Instance.Characteristic do end) new_value = - Value.dynamic(value_type, struct(value_type, Map.from_struct(updated))) + Value.dynamic(struct(value_type, Map.from_struct(updated))) [{characteristic, new_value} | acc] diff --git a/lib/diffo/provider/components/instance/extension/feature.ex b/lib/diffo/provider/components/instance/extension/feature.ex index 3416c25..0a6e1e0 100644 --- a/lib/diffo/provider/components/instance/extension/feature.ex +++ b/lib/diffo/provider/components/instance/extension/feature.ex @@ -54,7 +54,7 @@ defmodule Diffo.Provider.Instance.Feature do characteristic_ids = Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc -> try do - value = Value.dynamic(value_type, struct(value_type)) + value = Value.dynamic(struct(value_type)) case Provider.create_characteristic(%{name: name, value: value, type: :feature}) do {:ok, result} -> diff --git a/lib/diffo/type/value.ex b/lib/diffo/type/value.ex index 7dfb6c2..aa91de1 100644 --- a/lib/diffo/type/value.ex +++ b/lib/diffo/type/value.ex @@ -67,7 +67,9 @@ defmodule Diffo.Type.Value do def primitive(type, value), do: Diffo.Type.Primitive.wrap(type, value) - def dynamic(type, value), + def dynamic(%type{} = dynamic), do: dynamic(type, dynamic) + + defp dynamic(type, value), do: %{type: "dynamic", value: %Diffo.Type.Dynamic{type: type, value: value}} def wrap(type, value), do: %Ash.Union{type: type, value: value} diff --git a/test/provider/characteristic_test.exs b/test/provider/characteristic_test.exs index 3b40d02..fcdc446 100644 --- a/test/provider/characteristic_test.exs +++ b/test/provider/characteristic_test.exs @@ -199,7 +199,7 @@ defmodule Diffo.Provider.CharacteristicTest do updated_characteristic = characteristic |> Diffo.Provider.update_characteristic!(%{ - value: Value.dynamic(Patch, %Patch{aEnd: 1, zEnd: 42}) + value: Value.dynamic(%Patch{aEnd: 1, zEnd: 42}) }) assert Diffo.Unwrap.unwrap(updated_characteristic.value) == %Patch{aEnd: 1, zEnd: 42} @@ -224,7 +224,7 @@ defmodule Diffo.Provider.CharacteristicTest do use Outstand @port1 %Diffo.Provider.Characteristic{name: "port", value: Value.primitive("integer", 1)} @port3 %Diffo.Provider.Characteristic{name: "port", value: Value.primitive("integer", 3)} - #@port5 %Diffo.Provider.Characteristic{name: "port", value: Value.primitive("integer", 5)} + # @port5 %Diffo.Provider.Characteristic{name: "port", value: Value.primitive("integer", 5)} @pair1 %Diffo.Provider.Characteristic{name: "pair", value: Value.primitive("integer", 1)} @name_only %Diffo.Provider.Characteristic{name: "port"} # map only diff --git a/test/support/characteristics.ex b/test/support/characteristics.ex index f16b472..8416844 100644 --- a/test/support/characteristics.ex +++ b/test/support/characteristics.ex @@ -25,7 +25,8 @@ defmodule Diffo.Test.Characteristics do Enum.each( expected, fn {field, expected_value} -> - assert expected_value --- Map.get(Diffo.Unwrap.unwrap(characteristic.value), field) == nil + assert expected_value --- + Map.get(Diffo.Unwrap.unwrap(characteristic.value), field) == nil end ) diff --git a/test/type/value_test.exs b/test/type/value_test.exs index 586415f..122e410 100644 --- a/test/type/value_test.exs +++ b/test/type/value_test.exs @@ -13,7 +13,7 @@ defmodule Diffo.Type.ValueTest do describe "value cast and dump" do test "cast_input dynamic using Value.dynamic" do - value = Value.dynamic(Patch, %Patch{aEnd: 1, zEnd: 42}) + value = Value.dynamic(%Patch{aEnd: 1, zEnd: 42}) assert {:ok, %Ash.Union{type: :dynamic, value: %Dynamic{type: Patch}}} = Ash.Type.cast_input(Value, value, Value.subtype_constraints()) @@ -33,7 +33,7 @@ defmodule Diffo.Type.ValueTest do Ash.Type.cast_input(Value, value, Value.subtype_constraints()) end - @tag bugged: "raw Dynamic struct cast_input requires Value.dynamic/2 wrapper" + @tag bugged: "raw Dynamic struct cast_input requires Value wrapper" @tag :skip test "cast_input dynamic" do value = %Dynamic{type: Patch, value: %Patch{aEnd: 1, zEnd: 42}} @@ -92,7 +92,7 @@ defmodule Diffo.Type.ValueTest do end test "roundtrip dynamic from Value.dynamic" do - value = Value.dynamic(Patch, %Patch{aEnd: 1, zEnd: 42}) + value = Value.dynamic(%Patch{aEnd: 1, zEnd: 42}) {:ok, cast} = Ash.Type.cast_input(Value, value, Value.subtype_constraints()) {:ok, dumped} = Ash.Type.dump_to_native(Value, cast, Value.subtype_constraints()) {:ok, result} = Ash.Type.cast_stored(Value, dumped, Value.subtype_constraints())