Current section

Files

Jump to
timex lib parse datetime tokenizers directive.ex
Raw

lib/parse/datetime/tokenizers/directive.ex

defmodule Timex.Parse.DateTime.Tokenizers.Directive do
@moduledoc false
alias Timex.Parse.DateTime.Parsers
alias Timex.Parse.DateTime.Tokenizers.Directive
defstruct type: :literal,
value: nil,
modifiers: [],
flags: [],
width: [min: -1, max: nil],
parser: nil,
weight: 0
@type t :: %__MODULE__{}
@doc """
Gets a parsing directive for the given token name, where the token name
is an atom.
## Examples
iex> alias Timex.Parsers.Directive
...> %Directive{type: type, flags: flags} = Directive.get(:year4, "YYYY", padding: :zeros)
...> {type, flags}
{:year4, [padding: :zeros]}
"""
@spec get(atom, String.t, [{atom, term}] | []) :: Directive.t
def get(type, directive, opts \\ []) do
width = Keyword.get(opts, :width, [min: 1, max: nil])
flags = Keyword.merge(Keyword.get(opts, :flags, []), width)
modifiers = Keyword.get(opts, :modifiers, [])
get(type, directive, flags, modifiers, width)
end
@simple_types [:year4, :year2, :century, :hour24, :hour12,
:zname, :zoffs, :zoffs_colon, :zoffs_sec,
:iso_date, :iso_time, :iso_week, :iso_weekday, :iso_ordinal,
:ansic, :unix, :kitchen, :slashed, :asn1_utc_time, :asn1_generalized_time,
:strftime_iso_clock, :strftime_iso_clock_full, :strftime_kitchen, :strftime_iso_shortdate,
]
@mapped_types [iso_year4: :year4, iso_year2: :year2,
month: :month2, mshort: :month_short, mfull: :month_full,
day: :day_of_month, oday: :day_of_year,
iso_weeknum: :week_of_year, week_mon: :week_of_year, week_sun: :week_of_year,
wday_mon: :weekday, wday_sun: :weekday, wdshort: :weekday_short, wdfull: :weekday_full,
min: :minute, sec: :second, sec_fractional: :second_fractional, sec_epoch: :seconds_epoch,
us: :microseconds, ms: :milliseconds, am: :ampm, AM: :ampm, zabbr: :zname,
iso_8601_extended: :iso8601_extended, iso_8601_basic: :iso8601_basic,
rfc_822: :rfc822, rfc_1123: :rfc1123, rfc_3339: :rfc3339,
strftime_iso_date: :iso_date,
]
@mapped_zulu_types [
iso_8601_extended_z: :iso8601_extended, iso_8601_basic_z: :iso8601_basic,
rfc_822z: :rfc822, rfc_1123z: :rfc1123, rfc_3339z: :rfc3339, asn1_generalized_time_z: :asn1_generalized_time
]
for type <- @simple_types do
def get(unquote(type), directive, flags, mods, width) do
%Directive{type: unquote(type),
value: directive,
flags: flags,
modifiers: mods,
width: width,
parser: apply(Parsers, unquote(type), [flags])}
end
end
for {type, parser_fun} <- @mapped_types do
def get(unquote(type), directive, flags, mods, width) do
%Directive{type: unquote(type),
value: directive,
flags: flags,
modifiers: mods,
width: width,
parser: apply(Parsers, unquote(parser_fun), [flags])}
end
end
for {type, parser_fun} <- @mapped_zulu_types do
def get(unquote(type), directive, flags, mods, width) do
%Directive{type: unquote(type),
value: directive,
flags: flags,
modifiers: mods,
width: width,
parser: apply(Parsers, unquote(parser_fun), [[{:zulu, true}|flags]])}
end
end
def get(:asn1_generalized_time_tz, directive, flags, mods, width) do
%Directive{type: :asn1_generalized_time_tz,
value: directive,
flags: flags,
modifiers: mods,
width: width,
parser: Parsers.asn1_generalized_time([{:zoffs, true}|flags])}
end
# Catch-all
def get(type, _directive, _flags, _mods, _width),
do: {:error, "Unrecognized directive type: #{type}."}
end