Current section

Files

Jump to
timex lib datetime map.ex
Raw

lib/datetime/map.ex

defimpl Timex.Protocol, for: Map do
@moduledoc """
This is an implementation of Timex.Protocol for plain maps,
which allows working directly with deserialized date/times
via the Timex API. It accepts date/time maps with either atom
or string keys, as long as those keys match current Calendar
types. It also accepts a few legacy variations for types which
may have been serialized with older versions of Timex.
"""
defmacro convert!(map, function, args \\ []) when is_list(args) do
quote do
case Timex.Convert.convert_map(unquote(map)) do
{:error, _} = err -> raise Timex.ConvertError, err
converted -> Timex.Protocol.unquote(function)(converted, unquote_splicing(args))
end
end
end
defmacro convert(map, function, args \\ []) when is_list(args) do
quote do
case Timex.Convert.convert_map(unquote(map)) do
{:error, _} = err -> err
converted -> Timex.Protocol.unquote(function)(converted, unquote_splicing(args))
end
end
end
def to_julian(map), do: convert!(map, :to_julian)
def to_gregorian_seconds(map), do: convert!(map, :to_gregorian_seconds)
def to_gregorian_microseconds(map), do: convert!(map, :to_gregorian_microseconds)
def to_unix(map), do: convert!(map, :to_unix)
def to_date(map), do: convert!(map, :to_date)
def to_datetime(map, timezone), do: convert(map, :to_datetime, [timezone])
def to_naive_datetime(map), do: convert(map, :to_naive_datetime)
def to_erl(map), do: convert(map, :to_erl)
def century(map), do: convert!(map, :century)
def is_leap?(map), do: convert!(map, :is_leap?)
def shift(map, options), do: convert(map, :shift, [options])
def set(map, options), do: convert(map, :set, [options])
def beginning_of_day(map), do: convert!(map, :beginning_of_day)
def end_of_day(map), do: convert!(map, :end_of_day)
def beginning_of_week(map, start), do: convert(map, :beginning_of_week, [start])
def end_of_week(map, start), do: convert(map, :end_of_week, [start])
def beginning_of_year(map), do: convert!(map, :beginning_of_year)
def end_of_year(map), do: convert!(map, :end_of_year)
def beginning_of_quarter(map), do: convert!(map, :beginning_of_quarter)
def end_of_quarter(map), do: convert!(map, :end_of_quarter)
def beginning_of_month(map), do: convert!(map, :beginning_of_month)
def end_of_month(map), do: convert!(map, :end_of_month)
def quarter(map), do: convert!(map, :quarter)
def days_in_month(map), do: convert!(map, :days_in_month)
def week_of_month(map), do: convert!(map, :week_of_month)
def weekday(map), do: convert!(map, :weekday)
def day(map), do: convert!(map, :day)
def is_valid?(map), do: convert!(map, :is_valid?)
def iso_week(map), do: convert!(map, :iso_week)
def from_iso_day(map, day), do: convert(map, :from_iso_day, [day])
end