defmodule Chartkick do require EEx gen_chart_fn = fn chart_type -> def unquote( chart_type |> Macro.underscore() |> String.to_atom() )( data_source, options \\ [] ) do chartkick_chart(unquote(chart_type), data_source, options) end end Enum.map( ~w(LineChart PieChart BarChart AreaChart ColumnChart ComboChart GeoChart ScatterChart Timeline), gen_chart_fn ) def chartkick_chart(klass, data_source, options \\ []) do id = Keyword.get_lazy(options, :id, &UUID.uuid4/0) height = Keyword.get(options, :height, "300px") width = Keyword.get(options, :width, "100%") only = Keyword.get(options, :only) case only do :html -> chartkick_tag(id, height, width) :script -> chartkick_script(klass, id, data_source, options) _ -> """ #{chartkick_tag(id, height, width)} #{chartkick_script(klass, id, data_source, options)} """ end end EEx.function_from_string( :def, :chartkick_script, ~s[], ~w(klass id data_source options)a ) EEx.function_from_string( :def, :chartkick_tag, ~s[