@@ -184,12 +184,38 @@ defmodule Doggo.Components.Icon do
184184 """
185185 end
186186
187- quote do
188- var! ( assigns ) =
189- assigns
190- |> var! ( )
191- |> assign ( :icon_module , unquote ( icon_module ) )
192- |> assign ( :icon_fun , unquote ( icon_fun ) )
187+ if is_nil ( icon_fun ) do
188+ mapping =
189+ Map . new (
190+ for { name , 1 } <- icon_module . __info__ ( :functions ) do
191+ { name |> Atom . to_string ( ) |> String . replace ( "_" , "-" ) , name }
192+ end
193+ )
194+
195+ quote do
196+ name = String . replace ( var! ( assigns ) . name , "_" , "-" )
197+
198+ icon_fun =
199+ Map . get ( unquote ( Macro . escape ( mapping ) ) , name ) ||
200+ raise """
201+ Unknown icon: #{ name }
202+ """
203+
204+ var! ( assigns ) =
205+ assigns
206+ |> var! ( )
207+ |> assign ( :icon_module , unquote ( icon_module ) )
208+ |> assign ( :icon_fun , icon_fun )
209+ |> assign ( :name , nil )
210+ end
211+ else
212+ quote do
213+ var! ( assigns ) =
214+ assigns
215+ |> var! ( )
216+ |> assign ( :icon_module , unquote ( icon_module ) )
217+ |> assign ( :icon_fun , unquote ( icon_fun ) )
218+ end
193219 end
194220 end
195221
@@ -220,14 +246,6 @@ defmodule Doggo.Components.Icon do
220246 attr :module , :atom
221247 attr :fun , :atom
222248
223- def dynamic_icon ( % { module: module , fun: nil } = assigns )
224- when is_atom ( module ) do
225- { module , assigns } = Map . pop! ( assigns , :module )
226- { name , assigns } = Map . pop! ( assigns , :name )
227- name = String . replace ( name , "-" , "_" )
228- apply ( module , String . to_existing_atom ( name ) , [ assigns ] )
229- end
230-
231249 def dynamic_icon ( % { module: module , fun: fun } = assigns )
232250 when is_atom ( module ) and is_atom ( fun ) do
233251 { module , assigns } = Map . pop! ( assigns , :module )
0 commit comments