Skip to content

Commit d5aad7c

Browse files
committed
improved error handling
1 parent 915b588 commit d5aad7c

16 files changed

Lines changed: 395 additions & 32 deletions

documentation/dsls/DSL-Diffo.Provider.Instance.Extension.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ Configuration for Instance Features
5656
features do
5757
feature :dynamic_line_management do
5858
is_enabled? true
59-
characteristics do
60-
characteristic :constraints, Diffo.Access.Constraints
61-
end
59+
characteristic :constraints, Diffo.Access.Constraints
6260
end
6361
end
6462

lib/diffo/helpers/uuid.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ defmodule Diffo.Uuid do
6363

6464
case info do
6565
{:ok, result} ->
66-
if result[:version] == 4 do
66+
if result[:version] == 4 and result[:variant] == :rfc4122 do
6767
true
6868
else
6969
false

lib/diffo/provider/components/instance/extension/characteristic.ex

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ defmodule Diffo.Provider.Instance.Characteristic do
3030
[] ->
3131
changeset
3232

33+
{:error, error} ->
34+
Ash.Changeset.add_error(changeset, error)
35+
3336
_ ->
3437
characteristic_ids = Enum.map(characteristics, &Map.get(&1, :id))
3538
Ash.Changeset.force_set_argument(changeset, :characteristics, characteristic_ids)
@@ -43,14 +46,20 @@ defmodule Diffo.Provider.Instance.Characteristic do
4346
characteristics = Info.characteristics(module)
4447

4548
Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc ->
46-
value = struct(value_type)
49+
try do
50+
value = struct(value_type)
4751

48-
case Provider.create_characteristic(%{name: name, type: type, value: value}) do
49-
{:ok, result} ->
50-
{:cont, [result | acc]}
52+
case Provider.create_characteristic(%{name: name, type: type, value: value}) do
53+
{:ok, result} ->
54+
{:cont, [result | acc]}
5155

52-
{:error, _error} ->
53-
{:halt, []}
56+
{:error, error} ->
57+
{:halt, {:error, error}}
58+
end
59+
rescue
60+
_e in UndefinedFunctionError ->
61+
{:halt,
62+
{:error, "couldn't create characteristic with value of unknown type #{value_type}"}}
5463
end
5564
end)
5665
end

lib/diffo/provider/components/instance/extension/feature.ex

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ defmodule Diffo.Provider.Instance.Feature do
3030
[] ->
3131
changeset
3232

33+
{:error, error} ->
34+
Ash.Changeset.add_error(changeset, error)
35+
3336
_ ->
3437
feature_ids = Enum.map(features, &Map.get(&1, :id))
3538
Ash.Changeset.force_set_argument(changeset, :features, feature_ids)
@@ -49,28 +52,41 @@ defmodule Diffo.Provider.Instance.Feature do
4952
fn %{name: name, is_enabled?: isEnabled, characteristics: characteristics}, acc ->
5053
characteristic_ids =
5154
Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc ->
52-
value = struct(value_type)
55+
try do
56+
value = struct(value_type)
57+
58+
case Provider.create_characteristic(%{name: name, value: value, type: :feature}) do
59+
{:ok, result} ->
60+
{:cont, [result.id | acc]}
61+
62+
{:error, error} ->
63+
{:halt, {:error, error}}
64+
end
65+
rescue
66+
_e in UndefinedFunctionError ->
67+
{:halt,
68+
{:error,
69+
"couldn't create feature characteristic with value of unknown type #{value_type}"}}
70+
end
71+
end)
5372

54-
case Provider.create_characteristic(%{name: name, value: value, type: :feature}) do
73+
case characteristic_ids do
74+
{:error, error} ->
75+
{:halt, {:error, error}}
76+
77+
_ ->
78+
# create feature with feature characteristics
79+
case Provider.create_feature(%{
80+
name: name,
81+
isEnabled: isEnabled,
82+
characteristics: characteristic_ids
83+
}) do
5584
{:ok, result} ->
56-
{:cont, [result.id | acc]}
85+
{:cont, [result | acc]}
5786

58-
{:error, _error} ->
59-
{:halt, []}
87+
{:error, error} ->
88+
{:halt, {:error, error}}
6089
end
61-
end)
62-
63-
# create feature with feature characteristics
64-
case Provider.create_feature(%{
65-
name: name,
66-
isEnabled: isEnabled,
67-
characteristics: characteristic_ids
68-
}) do
69-
{:ok, result} ->
70-
{:cont, [result | acc]}
71-
72-
{:error, _error} ->
73-
{:halt, []}
7490
end
7591
end
7692
)

lib/diffo/provider/components/instance/extension/specification.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ defmodule Diffo.Provider.Instance.Specification do
2929
{:ok, specification} ->
3030
Ash.Changeset.force_set_argument(changeset, :specified_by, specification.id)
3131

32-
{:error, _error} ->
33-
Logger.error("couldn't find/create required specification")
32+
{:error, error} ->
33+
Ash.Changeset.add_error(changeset, error)
3434
end
3535
end
3636

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#
33
# SPDX-License-Identifier: MIT
44

5-
defmodule Diffo.Test.AssignerTest do
5+
defmodule Diffo.InstanceExtension.AssignerTest do
66
@moduledoc false
77
use ExUnit.Case
88
alias Diffo.Provider.Specification
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
defmodule Diffo.InstanceExtension.CharacteristicTest do
6+
@moduledoc false
7+
use ExUnit.Case
8+
alias Diffo.Test.Servo
9+
10+
setup_all do
11+
AshNeo4j.BoltyHelper.start()
12+
end
13+
14+
setup do
15+
on_exit(fn ->
16+
AshNeo4j.Neo4jHelper.delete_all()
17+
end)
18+
end
19+
20+
describe "characteristic" do
21+
test "create resource fails when characteristic value type invalid" do
22+
{:error, error} = Servo.build_invalid_characteristic(%{})
23+
%Ash.Error.Invalid{errors: errors} = error
24+
25+
assert hd(errors).message ==
26+
"couldn't create characteristic with value of unknown type Elixir.InvalidValue"
27+
end
28+
end
29+
end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
defmodule Diffo.InstanceExtension.FeatureTest do
6+
@moduledoc false
7+
use ExUnit.Case
8+
alias Diffo.Test.Servo
9+
10+
setup_all do
11+
AshNeo4j.BoltyHelper.start()
12+
end
13+
14+
setup do
15+
on_exit(fn ->
16+
AshNeo4j.Neo4jHelper.delete_all()
17+
end)
18+
end
19+
20+
describe "feature" do
21+
test "create resource with fails when feature characteristic value type invalid" do
22+
{:error, error} = Servo.build_invalid_feature_characteristic(%{})
23+
%Ash.Error.Invalid{errors: errors} = error
24+
25+
assert hd(errors).message ==
26+
"couldn't create feature characteristic with value of unknown type Elixir.InvalidValue"
27+
end
28+
end
29+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
defmodule Diffo.InstanceExtension.SpecificationTest do
6+
@moduledoc false
7+
use ExUnit.Case
8+
alias Diffo.Test.Servo
9+
10+
setup_all do
11+
AshNeo4j.BoltyHelper.start()
12+
end
13+
14+
setup do
15+
on_exit(fn ->
16+
AshNeo4j.Neo4jHelper.delete_all()
17+
end)
18+
end
19+
20+
describe "specification" do
21+
test "create resource fails when specification id not uuid v4" do
22+
{:error, error} = Servo.build_invalid_specification(%{})
23+
%Ash.Error.Invalid{errors: errors} = error
24+
assert hd(errors).message == "must be a uuid v4 or nil"
25+
end
26+
end
27+
end

test/provider/instance_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ defmodule Diffo.Provider.InstanceTest do
1212
end
1313

1414
setup do
15-
on_exit(fn ->
15+
on_exit(fn ->
1616
AshNeo4j.Neo4jHelper.delete_all()
1717
end)
1818
end

0 commit comments

Comments
 (0)