Skip to content

Commit 0a43e79

Browse files
authored
feat: make enum label/description overridable (#2594)
follow-up for #2172 and #2222
1 parent 47afba5 commit 0a43e79

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

lib/ash/type/enum.ex

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,32 @@ defmodule Ash.Type.Enum do
111111
MyApp.TicketStatus.details(:closed)
112112
iex> %{description: "A closed ticket", label: "Closed"}
113113
```
114+
115+
### Overriding label and description
116+
117+
The `label/1` and `description/1` functions are overridable. This can be useful, for example,
118+
to integrate with Gettext for internationalization. Use the Gettext macro in the `values` option
119+
so that the keys are discovered at compile time, then override `label/1` to translate at runtime:
120+
121+
```elixir
122+
defmodule MyApp.TicketStatus do
123+
use Gettext, backend: MyApp.Gettext
124+
125+
use Ash.Type.Enum,
126+
values: [
127+
open: [label: gettext("Open")],
128+
closed: [label: gettext("Closed")],
129+
escalated: [label: gettext("Escalated")]
130+
]
131+
132+
def label(nil), do: "N/A"
133+
134+
def label(value) do
135+
with label when is_binary(label) <- super(value),
136+
do: Gettext.gettext(MyApp.Gettext, label)
137+
end
138+
end
139+
```
114140
"""
115141
@doc "The list of valid values (not all input types that match them)"
116142
@callback values() :: [atom | String.t()]
@@ -329,7 +355,12 @@ defmodule Ash.Type.Enum do
329355
:error
330356
end
331357

332-
defoverridable match: 1, storage_type: 0, cast_stored: 2, dump_to_native: 2
358+
defoverridable match: 1,
359+
storage_type: 0,
360+
cast_stored: 2,
361+
dump_to_native: 2,
362+
label: 1,
363+
description: 1
333364
end
334365
end
335366

test/support/enum.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,23 @@ defmodule DescriptiveEnum do
2525
]
2626
end
2727

28+
defmodule OverriddenEnum do
29+
@moduledoc false
30+
31+
use Ash.Type.Enum,
32+
values: [
33+
:active,
34+
:inactive,
35+
:archived
36+
]
37+
38+
def label(:active), do: "Currently Active"
39+
def label(value), do: super(value)
40+
41+
def description(:active), do: "This item is currently active"
42+
def description(value), do: super(value)
43+
end
44+
2845
defmodule StringEnum do
2946
@moduledoc false
3047

test/type/enum_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ defmodule Ash.Test.Type.EnumTest do
100100
assert DescriptiveEnum.label(:with_details) == "I have a label"
101101
end
102102

103+
test "label and description can be overridden" do
104+
assert OverriddenEnum.label(:active) == "Currently Active"
105+
assert OverriddenEnum.label(:inactive) == "Inactive"
106+
assert OverriddenEnum.label(:archived) == "Archived"
107+
108+
assert OverriddenEnum.description(:active) == "This item is currently active"
109+
assert OverriddenEnum.description(:inactive) == nil
110+
assert OverriddenEnum.description(:archived) == nil
111+
end
112+
103113
describe "types are correctly generated" do
104114
test "simple atoms" do
105115
assert {:ok,

0 commit comments

Comments
 (0)