-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( <> ), party:fail(), fun(Hour) -> gleam@result:'try'( gleam@int:parse( <> ), 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 = <<<>/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).