# `Tempo.Event.Resolver`
[🔗](https://github.com/elixir-tempo/tempo/blob/v2.1.1/lib/tempo/event/resolver.ex#L1)

A behaviour for a consumer's own computed events, written `(name)e` in a
selection beside the built-ins of `Tempo.Event`.

A resolver names the events it owns with `known/0` and computes each one's
date with `date/3`, and is registered with
`config :ex_tempo, :event_resolvers, [MyApp.Events]`. The registry is read
each time a date is asked, so it may be set at compile time or at runtime;
the first resolver whose `known/0` claims a name computes it.

    defmodule MyApp.Events do
      @behaviour Tempo.Event.Resolver

      @impl true
      def known, do: ["fiscal-year-start"]

      @impl true
      def date("fiscal-year-start", year, _calendar), do: Date.new(year, 4, 1)
      def date(_name, _year, _calendar), do: {:error, :unknown_event}
    end

# `date`

```elixir
@callback date(name :: String.t(), year :: integer(), calendar :: module()) ::
  {:ok, Date.t()} | {:error, term()}
```

The date of a named event in a Gregorian year, `{:ok, date}` in
`Calendar.ISO` or `{:error, reason}`. `Tempo.Event.date/3` returns the
reason as that of a `Tempo.InvalidDateError`, and an exception as it is.

# `known`

```elixir
@callback known() :: [String.t()]
```

The event names this resolver computes.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
