Skip to content

Commit 297d11b

Browse files
committed
Refactor
1 parent 16504b5 commit 297d11b

4 files changed

Lines changed: 63 additions & 54 deletions

File tree

lib/live_debugger/utils/parsers.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ defmodule LiveDebugger.Utils.Parsers do
33
This module provides functions to parse some structs to string representation and vice versa.
44
"""
55

6+
@time_units ["µs", "ms", "s"]
7+
8+
@spec time_units() :: [String.t()]
9+
def time_units(), do: @time_units
10+
611
@spec parse_timestamp(non_neg_integer()) :: String.t()
712
def parse_timestamp(timestamp) do
813
timestamp
@@ -29,6 +34,15 @@ defmodule LiveDebugger.Utils.Parsers do
2934
end
3035
end
3136

37+
@spec time_to_microseconds(value :: non_neg_integer(), unit :: String.t()) :: non_neg_integer()
38+
def time_to_microseconds(value, unit) when unit in @time_units do
39+
case unit do
40+
"s" -> value * 1_000_000
41+
"ms" -> value * 1_000
42+
"µs" -> value
43+
end
44+
end
45+
3246
@spec pid_to_string(pid :: pid()) :: String.t()
3347
def pid_to_string(pid) when is_pid(pid) do
3448
pid |> :erlang.pid_to_list() |> to_string() |> String.slice(1..-2//1)

lib/live_debugger_web/components.ex

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,43 @@ defmodule LiveDebuggerWeb.Components do
7171
"""
7272
end
7373

74+
attr(:value_field, Phoenix.HTML.FormField, required: true)
75+
attr(:unit_field, Phoenix.HTML.FormField, required: true)
76+
attr(:units, :list, required: true)
77+
attr(:rest, :global, include: ~w(min max placeholder))
78+
79+
def input_with_units(assigns) do
80+
assigns =
81+
assigns
82+
|> assign(:errors, assigns.value_field.errors)
83+
84+
~H"""
85+
<div class={[
86+
"shadow-sm flex items-center rounded-[4px] outline outline-1 -outline-offset-1 has-[input:focus-within]:outline has-[input:focus-within]:outline-2 has-[input:focus-within]:-outline-offset-2",
87+
@errors == [] && "outline-default-border has-[input:focus-within]:outline-ui-accent",
88+
@errors != [] && "outline-error-text has-[input:focus-within]:outline-error-text"
89+
]}>
90+
<input
91+
id={@value_field.id}
92+
name={@value_field.name}
93+
type="number"
94+
class="block remove-arrow max-w-20 bg-surface-0-bg border-none py-2.5 pl-2 pr-3 text-xs text-primary-text placeholder:text-ui-muted focus:ring-0"
95+
value={Phoenix.HTML.Form.normalize_value("number", @value_field.value)}
96+
{@rest}
97+
/>
98+
<div class="grid shrink-0 grid-cols-1 focus-within:relative">
99+
<select
100+
id={@unit_field.id}
101+
name={@unit_field.name}
102+
class="border-none bg-surface-0-bg col-start-1 row-start-1 w-full appearance-none rounded-md py-1.5 pl-3 pr-7 text-xs text-secondary-text placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-ui-accent"
103+
>
104+
<%= Phoenix.HTML.Form.options_for_select(@units, @unit_field.value) %>
105+
</select>
106+
</div>
107+
</div>
108+
"""
109+
end
110+
74111
@doc """
75112
Renders a button.
76113

lib/live_debugger_web/live/traces_live.ex

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -441,24 +441,16 @@ defmodule LiveDebuggerWeb.TracesLive do
441441
execution_time = socket.assigns.current_filters.execution_time
442442

443443
execution_time
444-
|> Enum.filter(fn {_, value} -> value not in ["", "µs", "ms", "s"] end)
444+
|> Enum.filter(fn {_, value} -> value not in ["" | @time_units] end)
445445
|> Enum.map(fn {filter, value} -> {filter, String.to_integer(value)} end)
446446
|> Enum.map(fn {filter, value} ->
447447
case filter do
448-
:exec_time_min -> {filter, apply_time_unit(value, execution_time[:min_unit])}
449-
:exec_time_max -> {filter, apply_time_unit(value, execution_time[:max_unit])}
448+
:exec_time_min -> {filter, Parsers.time_to_microseconds(value, execution_time[:min_unit])}
449+
:exec_time_max -> {filter, Parsers.time_to_microseconds(value, execution_time[:max_unit])}
450450
end
451451
end)
452452
end
453453

454-
defp apply_time_unit(value, unit) do
455-
case unit do
456-
"ms" -> value * 1000
457-
"s" -> value * 1_000_000
458-
_ -> value
459-
end
460-
end
461-
462454
defp log_async_error(operation, reason) do
463455
Logger.error(
464456
"LiveDebugger encountered unexpected error while #{operation}: #{inspect(reason)}"

lib/live_debugger_web/live_components/filters_form.ex

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule LiveDebuggerWeb.LiveComponents.FiltersForm do
77

88
alias LiveDebugger.Utils.Callbacks, as: UtilsCallbacks
99
alias LiveDebugger.Structs.TreeNode
10+
alias LiveDebugger.Utils.Parsers
1011

1112
@impl true
1213
def update(assigns, socket) do
@@ -39,16 +40,18 @@ defmodule LiveDebuggerWeb.LiveComponents.FiltersForm do
3940
</div>
4041
<p class="font-medium mb-4 mt-6">Execution Time</p>
4142
<div class="mt-3 flex gap-3 items-center">
42-
<.time_input
43+
<.input_with_units
4344
value_field={@form[:exec_time_min]}
4445
unit_field={@form[:min_unit]}
46+
units={Parsers.time_units()}
4547
min="0"
4648
placeholder="min"
4749
/> -
48-
<.time_input
50+
<.input_with_units
4951
value_field={@form[:exec_time_max]}
5052
unit_field={@form[:max_unit]}
5153
min="0"
54+
units={Parsers.time_units()}
5255
placeholder="max"
5356
/>
5457
</div>
@@ -78,44 +81,6 @@ defmodule LiveDebuggerWeb.LiveComponents.FiltersForm do
7881
"""
7982
end
8083

81-
attr(:value_field, Phoenix.HTML.FormField, required: true)
82-
attr(:unit_field, Phoenix.HTML.FormField, required: true)
83-
attr(:rest, :global, include: ~w(min max placeholder))
84-
85-
defp time_input(assigns) do
86-
assigns =
87-
assigns
88-
|> assign(:errors, assigns.value_field.errors)
89-
90-
~H"""
91-
<div class="shadow-sm">
92-
<div class={[
93-
"flex items-center rounded-[4px] outline outline-1 -outline-offset-1 has-[input:focus-within]:outline has-[input:focus-within]:outline-2 has-[input:focus-within]:-outline-offset-2",
94-
@errors == [] && "outline-default-border has-[input:focus-within]:outline-ui-accent",
95-
@errors != [] && "outline-error-text has-[input:focus-within]:outline-error-text"
96-
]}>
97-
<input
98-
id={@value_field.id}
99-
name={@value_field.name}
100-
type="number"
101-
class="block remove-arrow max-w-20 bg-surface-0-bg border-none py-2.5 pl-2 pr-3 text-xs text-primary-text placeholder:text-ui-muted focus:ring-0"
102-
value={Phoenix.HTML.Form.normalize_value("number", @value_field.value)}
103-
{@rest}
104-
/>
105-
<div class="grid shrink-0 grid-cols-1 focus-within:relative">
106-
<select
107-
id={@unit_field.id}
108-
name={@unit_field.name}
109-
class="border-none bg-surface-0-bg col-start-1 row-start-1 w-full appearance-none rounded-md py-1.5 pl-3 pr-7 text-xs text-secondary-text placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-ui-accent"
110-
>
111-
<%= Phoenix.HTML.Form.options_for_select(["µs", "ms", "s"], @unit_field.value) %>
112-
</select>
113-
</div>
114-
</div>
115-
</div>
116-
"""
117-
end
118-
11984
@impl true
12085
def handle_event("submit", params, socket) do
12186
case update_filters(socket.assigns.active_filters, params) do
@@ -205,9 +170,10 @@ defmodule LiveDebuggerWeb.LiveComponents.FiltersForm do
205170
end
206171
end
207172

208-
defp apply_unit_factor(value, "µs"), do: String.to_integer(value)
209-
defp apply_unit_factor(value, "ms"), do: String.to_integer(value) * 1000
210-
defp apply_unit_factor(value, "s"), do: String.to_integer(value) * 1_000_000
173+
defp apply_unit_factor(value, unit) do
174+
String.to_integer(value)
175+
|> Parsers.time_to_microseconds(unit)
176+
end
211177

212178
defp calculate_selected_filters(form) do
213179
callbacks =

0 commit comments

Comments
 (0)