lib/cocktail/rule.ex

defmodule Cocktail.Rule do
  @moduledoc """
  Represent a recurrence rule (RRULE).
  """

  alias Cocktail.{Builder, Rule, Validation}

  @type t :: %__MODULE__{
          count: pos_integer | nil,
          until: Cocktail.time() | nil,
          validations: Validation.validations_map()
        }

  @enforce_keys [:validations]
  defstruct count: nil,
            until: nil,
            validations: %{}

  @spec new(Cocktail.rule_options()) :: t
  def new(options) do
    {count, options} = Keyword.pop(options, :count)
    {until, options} = Keyword.pop(options, :until)
    validations = Validation.build_validations(options)

    %Rule{count: count, until: until, validations: validations}
  end

  @spec set_until(t, Cocktail.time()) :: t
  def set_until(%__MODULE__{} = rule, end_time), do: %{rule | until: end_time}

  defimpl Inspect, for: __MODULE__ do
    import Inspect.Algebra

    def inspect(rule, _) do
      concat(["#Cocktail.Rule<", Builder.String.build_rule(rule), ">"])
    end
  end
end