Skip to content

Commit 4a66aa5

Browse files
committed
Begin defining cron to words in a helper
1 parent 0b55b65 commit 4a66aa5

File tree

2 files changed

+401
-0
lines changed

2 files changed

+401
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
defmodule Oban.Web.Helpers.CronHelper do
2+
@moduledoc false
3+
4+
5+
@doc """
6+
7+
"""
8+
@spec to_words(String.t()) :: String.t()
9+
def to_words("@reboot"), do: "After rebooting"
10+
def to_words("@annually"), do: to_words("0 0 1 1 *")
11+
def to_words("@yearly"), do: to_words("0 0 1 1 *")
12+
def to_words("@monthly"), do: to_words("0 0 1 * *")
13+
def to_words("@weekly"), do: to_words("0 0 * * 0")
14+
def to_words("@midnight"), do: to_words("0 0 * * *")
15+
def to_words("@daily"), do: to_words("0 0 * * *")
16+
def to_words("@hourly"), do: to_words("0 * * * *")
17+
18+
def to_words(expr) when is_binary(expr) do
19+
expr
20+
|> String.split(~r/\s+/, trim: true, parts: 5)
21+
|> Enum.zip(~w(minute hour day month weekday))
22+
|> Enum.map(&part_to_words/1)
23+
|> Enum.reject(& &1 == "")
24+
|> Enum.join(", ")
25+
end
26+
27+
defp part_to_words({field, unit}) do
28+
field
29+
|> String.split(~r/\s*,\s*/)
30+
|> Enum.map_join(" and ", &parse_part(&1, unit))
31+
end
32+
33+
defp parse_part(part, unit) do
34+
cond do
35+
part == "*" and unit == "minute" ->
36+
"Every minute"
37+
38+
part == "*" ->
39+
nil
40+
41+
part =~ ~r/^\d+$/ ->
42+
part
43+
44+
part =~ ~r/^\*\/[1-9]\d?$/ ->
45+
"*/" <> step = part
46+
47+
"Every #{step} #{unit}s"
48+
49+
# part =~ ~r/^\d+(\-\d+)?\/[1-9]\d?$/ ->
50+
# parse_range_step(part, range)
51+
52+
# part =~ ~r/^\d+\-\d+$/ ->
53+
# parse_range(part, range)
54+
end
55+
end
56+
57+
# defp parse_range_step(part, max_range) do
58+
# [range, step] = String.split(part, "/")
59+
60+
# parse_step(step, parse_range(range, max_range))
61+
# end
62+
63+
# defp parse_range(part, max_range) do
64+
# case String.split(part, "-") do
65+
# [rall] ->
66+
# String.to_integer(rall)..Enum.max(max_range)
67+
68+
# [rmin, rmax] ->
69+
# rmin = String.to_integer(rmin)
70+
# rmax = String.to_integer(rmax)
71+
72+
# if rmin <= rmax do
73+
# rmin..rmax
74+
# else
75+
# throw(
76+
# {:error,
77+
# "left side (#{rmin}) of a range must be less than or equal to the right side (#{rmax})"}
78+
# )
79+
# end
80+
# end
81+
# end
82+
end

0 commit comments

Comments
 (0)