defmodule Tempus.Sigils do @moduledoc "Handy sigils to instantiate `Tempus.Slot`" alias Tempus.Slot @doc ~S""" Handles the sigil `~I` for `Tempus.Slot`. It returns a slot without interpolations and without escape characters, except for the escaping of the closing sigil character itself. ## Examples iex> import Tempus.Sigils iex> ~I(2021-03-30T06:35:40Z|2021-03-30T06:36:00Z) %Tempus.Slot{from: ~U[2021-03-30 06:35:40Z], to: ~U[2021-03-30 06:36:00Z]} iex> ~I(2021-03-30|2021-03-31)d %Tempus.Slot{from: ~U[2021-03-30 00:00:00.000000Z], to: ~U[2021-03-31 23:59:59.999999Z]} iex> ~I(2021-03-30)d %Tempus.Slot{from: ~U[2021-03-30 00:00:00.000000Z], to: ~U[2021-03-30 23:59:59.999999Z]} """ defmacro sigil_I({:<<>>, _, [binary]}, modifiers) when is_binary(binary) do module = case modifiers do [?d] -> Date [?t] -> Time [] -> DateTime end from_iso = &(&1 |> module.from_iso8601() |> elem(1) |> Slot.wrap()) result = binary |> String.split("|") |> case do [part] -> from_iso.(part) [_, _] = interval -> interval |> Enum.map(from_iso) |> Slot.join() end |> Macro.escape() quote(generated: true, location: :keep, do: unquote(result)) end end