Skip to content

Commit f1b75ca

Browse files
committed
Fix manifest decoding
1 parent bac99dd commit f1b75ca

2 files changed

Lines changed: 43 additions & 3 deletions

File tree

lib/phoenix_iconify/manifest.ex

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ defmodule PhoenixIconify.Manifest do
108108
end
109109

110110
defp decode!(json) do
111-
%{version: @version, icons: icons} = Jason.decode!(json, keys: :atoms!)
111+
%{"version" => @version, "icons" => icons} = Jason.decode!(json)
112112

113113
unless is_list(icons) do
114114
raise ArgumentError, "invalid PhoenixIconify manifest: expected icons to be a list"
@@ -117,8 +117,30 @@ defmodule PhoenixIconify.Manifest do
117117
Map.new(icons, &icon_entry/1)
118118
end
119119

120-
defp icon_entry(icon) do
121-
icon = struct!(Iconify.Icon, icon)
120+
defp icon_entry(icon) when is_map(icon) do
121+
icon = struct!(Iconify.Icon, normalize_icon(icon))
122122
{icon.name, icon}
123123
end
124+
125+
defp normalize_icon(icon) do
126+
%{
127+
name: required_icon_value(icon, "name"),
128+
body: required_icon_value(icon, "body"),
129+
width: Map.get(icon, "width", 16),
130+
height: Map.get(icon, "height", 16),
131+
left: Map.get(icon, "left", 0),
132+
top: Map.get(icon, "top", 0),
133+
rotate: Map.get(icon, "rotate", 0),
134+
h_flip: Map.get(icon, "h_flip", false),
135+
v_flip: Map.get(icon, "v_flip", false),
136+
hidden: Map.get(icon, "hidden", false)
137+
}
138+
end
139+
140+
defp required_icon_value(icon, key) do
141+
case Map.fetch(icon, key) do
142+
{:ok, value} -> value
143+
:error -> raise ArgumentError, "invalid PhoenixIconify manifest: icon missing #{key}"
144+
end
145+
end
124146
end

test/phoenix_iconify/manifest_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ defmodule PhoenixIconify.ManifestTest do
3232
end
3333
end
3434

35+
test "reads manifests before icon field atoms exist" do
36+
path =
37+
Path.join(System.tmp_dir!(), "test_manifest_strings_#{:rand.uniform(1_000_000)}.json")
38+
39+
try do
40+
File.write!(
41+
path,
42+
~s({"version":1,"icons":[{"name":"lucide:sun","body":"<path/>","width":24,"height":24}]})
43+
)
44+
45+
assert %{"lucide:sun" => icon} = Manifest.read(path)
46+
assert icon.width == 24
47+
assert icon.height == 24
48+
after
49+
File.rm(path)
50+
end
51+
end
52+
3553
test "returns empty map for missing file" do
3654
assert Manifest.read("/nonexistent/path.json") == %{}
3755
end

0 commit comments

Comments
 (0)