Current section
Files
Jump to
Current section
Files
src/glrss_parser@rss@date.erl
-module(glrss_parser@rss@date).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([dow_from/1, dow_to_short/1, empty/0, parse/1]).
-export_type([rss_date/0, day_of_week/0, date/0, time/0, hour/0, zone/0]).
-type rss_date() :: {rss_date,
gleam@option:option(day_of_week()),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()}.
-type day_of_week() :: monday |
tuesday |
wednesday |
thursday |
friday |
saturday |
sunday.
-type date() :: {date, integer(), integer(), integer()}.
-type time() :: {time, hour(), zone()}.
-type hour() :: {hour, integer(), integer(), integer()}.
-type zone() :: {zone, integer()}.
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 30).
-spec dow_from(binary()) -> {ok, day_of_week()} | {error, nil}.
dow_from(Str) ->
case Str of
<<"Mon"/utf8>> ->
{ok, monday};
<<"Monday"/utf8>> ->
{ok, monday};
<<"Tue"/utf8>> ->
{ok, tuesday};
<<"Tuesday"/utf8>> ->
{ok, tuesday};
<<"Wed"/utf8>> ->
{ok, wednesday};
<<"Wednesday"/utf8>> ->
{ok, wednesday};
<<"Thu"/utf8>> ->
{ok, thursday};
<<"Thursday"/utf8>> ->
{ok, thursday};
<<"Fri"/utf8>> ->
{ok, friday};
<<"Friday"/utf8>> ->
{ok, friday};
<<"Sat"/utf8>> ->
{ok, saturday};
<<"Saturday"/utf8>> ->
{ok, saturday};
<<"Sun"/utf8>> ->
{ok, sunday};
<<"Sunday"/utf8>> ->
{ok, sunday};
_ ->
{error, nil}
end.
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 43).
-spec dow_to_short(day_of_week()) -> binary().
dow_to_short(Dow) ->
case Dow of
monday ->
<<"Mon"/utf8>>;
tuesday ->
<<"Tue"/utf8>>;
wednesday ->
<<"Wed"/utf8>>;
thursday ->
<<"Thu"/utf8>>;
friday ->
<<"Fri"/utf8>>;
saturday ->
<<"Sat"/utf8>>;
sunday ->
<<"Sun"/utf8>>
end.
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 55).
-spec empty() -> rss_date().
empty() ->
{rss_date, none, 0, 0, 0, 0, 0, 0, 0}.
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 96).
-spec day() -> party:parser(gleam@option:option(day_of_week()), any()).
day() ->
party:do(
party:many1_concat(party:letter()),
fun(Str) ->
party:do(
party:seq(party:char(<<","/utf8>>), party:whitespace1()),
fun(_) -> _pipe = Str,
_pipe@1 = dow_from(_pipe),
_pipe@2 = gleam@option:from_result(_pipe@1),
party:return(_pipe@2) end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 123).
-spec month3_to_int(binary()) -> {ok, integer()} | {error, nil}.
month3_to_int(Month) ->
case Month of
<<"Jan"/utf8>> ->
{ok, 1};
<<"Feb"/utf8>> ->
{ok, 2};
<<"Mar"/utf8>> ->
{ok, 3};
<<"Apr"/utf8>> ->
{ok, 4};
<<"May"/utf8>> ->
{ok, 5};
<<"Jun"/utf8>> ->
{ok, 6};
<<"Jul"/utf8>> ->
{ok, 7};
<<"Aug"/utf8>> ->
{ok, 8};
<<"Sep"/utf8>> ->
{ok, 9};
<<"Oct"/utf8>> ->
{ok, 10};
<<"Nov"/utf8>> ->
{ok, 11};
<<"Dec"/utf8>> ->
{ok, 12};
_ ->
{error, nil}
end.
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 185).
-spec zone_int() -> party:parser(zone(), any()).
zone_int() ->
Digit = party:digit(),
party:do(
party:either(party:char(<<"+"/utf8>>), party:char(<<"-"/utf8>>)),
fun(Sign) ->
party:do(
Digit,
fun(Hour_tens) ->
party:do(
Digit,
fun(Hour_ones) ->
party:do(
Digit,
fun(Min_tens) ->
party:do(
Digit,
fun(Min_ones) ->
glrss_parser@util:try_unwrap(
gleam@int:parse(
<<Hour_tens/binary,
Hour_ones/binary>>
),
party:fail(),
fun(Hour) ->
gleam@result:'try'(
gleam@int:parse(
<<Min_tens/binary,
Min_ones/binary>>
),
fun(Min) ->
Sign@1 = case Sign of
<<"+"/utf8>> ->
1;
<<"-"/utf8>> ->
-1;
_ ->
erlang:error(
#{gleam_error => panic,
message => <<"unreachable"/utf8>>,
module => <<"glrss_parser/rss/date"/utf8>>,
function => <<"zone_int"/utf8>>,
line => 197}
)
end,
{ok,
party:return(
{zone,
Sign@1 * ((Hour
* 60)
+ Min)}
)}
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 206).
-spec zone_str_to_hour(binary()) -> {ok, integer()} | {error, nil}.
zone_str_to_hour(Zone) ->
case Zone of
<<"Z"/utf8>> ->
{ok, 0};
<<"UT"/utf8>> ->
{ok, 0};
<<"GMT"/utf8>> ->
{ok, 0};
<<"A"/utf8>> ->
{ok, -1};
<<"B"/utf8>> ->
{ok, -2};
<<"C"/utf8>> ->
{ok, -3};
<<"D"/utf8>> ->
{ok, -4};
<<"EDT"/utf8>> ->
{ok, -4};
<<"E"/utf8>> ->
{ok, -5};
<<"EST"/utf8>> ->
{ok, -5};
<<"CDT"/utf8>> ->
{ok, -5};
<<"F"/utf8>> ->
{ok, -6};
<<"CST"/utf8>> ->
{ok, -6};
<<"MDT"/utf8>> ->
{ok, -6};
<<"G"/utf8>> ->
{ok, -7};
<<"MST"/utf8>> ->
{ok, -7};
<<"PDT"/utf8>> ->
{ok, -7};
<<"H"/utf8>> ->
{ok, -8};
<<"PST"/utf8>> ->
{ok, -8};
<<"I"/utf8>> ->
{ok, -9};
<<"K"/utf8>> ->
{ok, -10};
<<"L"/utf8>> ->
{ok, -11};
<<"M"/utf8>> ->
{ok, -12};
<<"N"/utf8>> ->
{ok, 1};
<<"O"/utf8>> ->
{ok, 2};
<<"P"/utf8>> ->
{ok, 3};
<<"Q"/utf8>> ->
{ok, 4};
<<"R"/utf8>> ->
{ok, 5};
<<"S"/utf8>> ->
{ok, 6};
<<"T"/utf8>> ->
{ok, 7};
<<"U"/utf8>> ->
{ok, 8};
<<"V"/utf8>> ->
{ok, 9};
<<"W"/utf8>> ->
{ok, 10};
<<"X"/utf8>> ->
{ok, 11};
<<"Y"/utf8>> ->
{ok, 12};
_ ->
{error, nil}
end.
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 173).
-spec zone_str() -> party:parser(zone(), any()).
zone_str() ->
Str_or_empty = fun(Res) -> gleam@result:unwrap(Res, <<""/utf8>>) end,
party:do(
party:letter(),
fun(C1) ->
party:do(
begin
_pipe = party:perhaps(party:letter()),
party:map(_pipe, Str_or_empty)
end,
fun(C2) ->
party:do(
begin
_pipe@1 = party:perhaps(party:letter()),
party:map(_pipe@1, Str_or_empty)
end,
fun(C3) ->
Zone = <<<<C1/binary, C2/binary>>/binary,
C3/binary>>,
case zone_str_to_hour(Zone) of
{ok, Hour} ->
party:return({zone, Hour * 60});
{error, _} ->
party:fail()
end
end
)
end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 169).
-spec zone() -> party:parser(zone(), any()).
zone() ->
party:either(zone_str(), zone_int()).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 237).
-spec p_integer() -> party:parser({ok, integer()} | {error, nil}, any()).
p_integer() ->
_pipe = party:digits(),
party:map(_pipe, fun gleam@int:parse/1).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 152).
-spec hour() -> party:parser(hour(), any()).
hour() ->
Colon = party:char(<<":"/utf8>>),
party:do(
p_integer(),
fun(Hour) ->
party:do(
Colon,
fun(_) ->
party:do(
p_integer(),
fun(Minute) ->
party:do(
party:perhaps(party:seq(Colon, p_integer())),
fun(Second) ->
Second@1 = begin
_pipe = Second,
_pipe@1 = gleam@result:flatten(_pipe),
gleam@result:unwrap(_pipe@1, 0)
end,
case {Hour, Minute} of
{{ok, Hour@1}, {ok, Minute@1}} ->
party:return(
{hour,
Hour@1,
Minute@1,
Second@1}
);
{_, _} ->
party:fail()
end
end
)
end
)
end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 141).
-spec time() -> party:parser(time(), any()).
time() ->
party:do(
hour(),
fun(Hour) ->
party:do(
party:whitespace1(),
fun(_) ->
party:do(
zone(),
fun(Zone) -> party:return({time, Hour, Zone}) end
)
end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 241).
-spec p_letters() -> party:parser(binary(), any()).
p_letters() ->
party:many1_concat(party:letter()).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 106).
-spec date() -> party:parser(date(), any()).
date() ->
party:do(
p_integer(),
fun(Day) ->
party:do(
party:whitespace1(),
fun(_) ->
party:do(
begin
_pipe = p_letters(),
party:map(_pipe, fun month3_to_int/1)
end,
fun(Month) ->
party:do(
party:whitespace1(),
fun(_) ->
party:do(
p_integer(),
fun(Year) -> case {Day, Month, Year} of
{{ok, Day@1},
{ok, Month@1},
{ok, Year@1}} ->
party:return(
{date,
Day@1,
Month@1,
Year@1}
);
{_, _, _} ->
party:fail()
end end
)
end
)
end
)
end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 68).
-spec date_time() -> party:parser(rss_date(), any()).
date_time() ->
party:do(
party:perhaps(day()),
fun(Dow) ->
party:do(
date(),
fun(_use0) ->
{date, Day, Month, Year} = _use0,
party:do(
party:whitespace1(),
fun(_) ->
party:do(
time(),
fun(_use0@1) ->
{time, T_hour, {zone, Offset_minutes}} = _use0@1,
{hour, Hour, Minute, Second} = T_hour,
Day_of_week = begin
_pipe = Dow,
_pipe@1 = gleam@option:from_result(
_pipe
),
gleam@option:flatten(_pipe@1)
end,
party:return(
{rss_date,
Day_of_week,
Year,
Month,
Day,
Hour,
Minute,
Second,
Offset_minutes}
)
end
)
end
)
end
)
end
).
-file("/home/benjamin/building/gleam/glrss_parser/src/glrss_parser/rss/date.gleam", 61).
-spec parse(binary()) -> {ok, rss_date()} | {error, party:parse_error(any())}.
parse(Str) ->
party:go(date_time(), Str).