Packages
timex
3.7.11
3.7.13
3.7.12
3.7.11
3.7.9
3.7.8
3.7.7
3.7.6
3.7.5
3.7.3
3.7.2
3.7.1
3.7.0
3.6.4
3.6.3
3.6.2
retired
3.6.1
3.6.0
3.5.0
3.4.2
3.4.1
3.3.0
3.2.2
3.2.1
3.2.0
3.1.25
retired
3.1.24
3.1.23
3.1.22
3.1.21
3.1.20
3.1.19
3.1.18
3.1.17
3.1.16
3.1.15
3.1.13
3.1.12
3.1.11
3.1.10
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.2.1
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.0
1.0.2
1.0.1
1.0.0
1.0.0-rc4
1.0.0-rc3
1.0.0-rc2
1.0.0-rc1
1.0.0-pre
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.2
0.18.1
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.6.0
0.5.0
0.4.8
0.4.7
0.4.6
Timex is a rich, comprehensive Date/Time library for Elixir projects, with full timezone support via the :tzdata package. If you need to manipulate dates, times, datetimes, timestamps, etc., then Timex is for you!
Current section
Files
Jump to
Current section
Files
lib/parse/duration/parser.ex
defmodule Timex.Parse.Duration.Parser do
@moduledoc """
This module is responsible for parsing input strings into Duration structs.
The actual parsing is delegated to specific parser modules, but this module
provides a unified API for all of them.
"""
alias Timex.Duration
alias Timex.Parse.ParseError
alias Timex.Parse.Duration.Parsers.ISO8601Parser
defmacro __using__(_) do
quote do
@behaviour Timex.Parse.Duration.Parser
alias Timex.Duration
end
end
@callback parse(String.t()) :: {:ok, Duration.t()} | {:error, term}
@doc """
Parses the given input using the ISO-8601 duration parser,
and returns either an :ok, or :error tuple.
"""
@spec parse(String.t()) :: {:ok, Duration.t()} | {:error, term}
def parse(str) when is_binary(str) do
parse(str, ISO8601Parser)
end
@doc """
Parses the given input using the provided parser module,
and returns either an :ok, or :error tuple.
"""
@spec parse(String.t(), module()) :: {:ok, Duration.t()} | {:error, term}
def parse(str, parser) when is_binary(str) and is_atom(parser) do
case parser.parse(str) do
%Duration{} = d -> {:ok, d}
{:ok, d} -> {:ok, d}
{:error, term} -> {:error, term}
end
end
@doc """
Parses the given input using the ISO-8601 duration parser,
and either returns a Duration, or raises an error.
"""
@spec parse!(String.t()) :: Duration.t() | no_return
def parse!(str) when is_binary(str) do
parse!(str, ISO8601Parser)
end
@doc """
Parses the given input using the provided parser module,
and either returns a Duration, or raises an error.
"""
@spec parse!(String.t(), module()) :: Duration.t() | no_return
def parse!(str, parser) when is_binary(str) and is_atom(parser) do
case parse(str) do
{:ok, d} -> d
{:error, reason} when is_binary(reason) -> raise ParseError, message: reason
{:error, term} -> raise ParseError, message: "#{inspect(term)}"
end
end
end