/
bindings.ex
76 lines (65 loc) · 1.81 KB
/
bindings.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
defmodule SurfaceBulmaWidgets.Bindings do
require Logger
defmacro bind(expr) do
name =
case expr do
{ {:., _meta1, [Phoenix.LiveView.Engine, :fetch_assign!]}, _meta2, [{:assigns, _meta3, nil}, name] } ->
name
_other ->
raise %ArgumentError{message: "only simple `@var` assigns work for now"}
end
quote do
{unquote(name), unquote(expr)}
end
end
def value({_k,v}) do
v
end
def key({k,_v}) do
k
end
def binding_send(socket, msg) do
case socket.assigns[:channel] do
{mod, name} ->
Phoenix.PubSub.broadcast(mod, name, msg)
_other ->
send(self(), msg)
end
end
def binding_update(socket, name, update_fn) do
id = socket.assigns[name] |> key()
value = socket.assigns[name] |> value() |> update_fn.()
socket |> binding_send({:update_bind, id, value})
end
def value_parser(%{assigns: assigns}, data, default \\ nil) do
Logger.warn("dropwdown selected: parsed: floats: #{inspect assigns[:floats]}")
Logger.warn("dropwdown selected: parsed: integers: #{inspect assigns[:integers]}")
cond do
assigns[:floats] ->
case data |> Float.parse() do
{number, _rest} -> number
:error -> default or :error
end
assigns[:integers] ->
case data |> Integer.parse() do
{number, _rest} -> number
:error -> default or :error
end
true -> data
end
end
def number_parser(kind, data, default \\ nil) do
case kind do
:float ->
case data |> Float.parse() do
{number, _rest} -> number
:error -> default || :error
end
:integer ->
case data |> Integer.parse() do
{number, _rest} -> number
:error -> default || :error
end
end
end
end