# `Chronicle.Events.Migrators`
[🔗](https://github.com/Cratis/Chronicle.Elixir/blob/main/lib/chronicle/events/migrators.ex#L4)

Discovers, groups, and materializes event type migrations.

`Chronicle.Events.EventTypes` uses this module while registering event types so each
event type registration includes its known generations and migration chain.

# `definition`

```elixir
@type definition() :: %{
  from_generation: pos_integer(),
  to_generation: pos_integer(),
  upcast_jmes_path: String.t(),
  downcast_jmes_path: String.t()
}
```

# `migration_module`

```elixir
@type migration_module() :: module()
```

# `t`

```elixir
@type t() :: %Chronicle.Events.Migrators{
  all: [migration_module()],
  by_event_type: %{optional(String.t()) =&gt; [migration_module()]}
}
```

# `all`

```elixir
@spec all(t()) :: [migration_module()]
```

Returns all registered migration modules.

# `definition_for`

```elixir
@spec definition_for(migration_module()) :: definition()
```

Builds the registration definition for a migration module.

# `for_event_type`

```elixir
@spec for_event_type(t(), module() | String.t()) :: [migration_module()]
```

Returns the migration modules for an event type module or event type id.

# `generations_for`

```elixir
@spec generations_for(t(), module() | String.t()) :: [pos_integer()]
```

Returns all known generations for an event type.

# `new`

```elixir
@spec new([migration_module()]) :: t()
```

Creates a migrator registry from migration modules.

Does not validate the set; use `validate/1` to detect more than one migration module
bridging the same pair of generations for the same event type.

# `validate`

```elixir
@spec validate([migration_module()]) :: :ok | {:error, Exception.t()}
```

Checks that at most one migration module bridges each pair of generations of an event type.

Returns `:ok`, or `{:error, exception}` with a
`Chronicle.Events.MultipleMigratorsForSameEventTypeGeneration` struct (not raised).

---

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