# `Minga.Language.Filetype.Registry`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/language/filetype/registry.ex#L1)

Runtime-extensible filetype registry backed by an Agent.

Starts empty and allows config or extensions to register overrides at runtime via `register/2`. Built-in language filetypes come from `Minga.Language.Registry`, where they are owned by their language pack source.

## Examples

    Minga.Language.Filetype.Registry.register(".astro", :astro)
    Minga.Language.Filetype.Registry.register("Justfile", :just)
    :astro = Minga.Language.Filetype.Registry.lookup_extension("astro")
    :just = Minga.Language.Filetype.Registry.lookup_filename("Justfile")

# `state`

```elixir
@type state() :: %{
  extensions: %{required(String.t()) =&gt; Minga.Language.Filetype.filetype()},
  filenames: %{required(String.t()) =&gt; Minga.Language.Filetype.filetype()},
  shebang_interpreters: %{
    required(String.t()) =&gt; Minga.Language.Filetype.filetype()
  }
}
```

Registry state: extension map, filename map, shebang map.

# `all_extensions`

```elixir
@spec all_extensions() :: %{
  required(String.t()) =&gt; Minga.Language.Filetype.filetype()
}
```

Returns all registered extensions.

# `all_filenames`

```elixir
@spec all_filenames() :: %{required(String.t()) =&gt; Minga.Language.Filetype.filetype()}
```

Returns all registered filenames.

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `lookup_extension`

```elixir
@spec lookup_extension(String.t()) :: Minga.Language.Filetype.filetype() | nil
```

Looks up a filetype by extension (without the dot, already downcased).

# `lookup_filename`

```elixir
@spec lookup_filename(String.t()) :: Minga.Language.Filetype.filetype() | nil
```

Looks up a filetype by exact filename.

# `lookup_shebang`

```elixir
@spec lookup_shebang(String.t()) :: Minga.Language.Filetype.filetype() | nil
```

Looks up a filetype by shebang interpreter name.

# `register`

```elixir
@spec register(String.t(), Minga.Language.Filetype.filetype() | nil) :: :ok
```

Registers a new filetype mapping.

`pattern` can be:
- An extension string starting with `.` (e.g., `".astro"`) — case-insensitive
- An exact filename string (e.g., `"Justfile"`) — case-sensitive

# `register_shebang`

```elixir
@spec register_shebang(String.t(), Minga.Language.Filetype.filetype() | nil) :: :ok
```

Registers a new shebang interpreter mapping.

`interpreter` is the basename of the interpreter (e.g., `"deno"`).

# `start_link`

```elixir
@spec start_link(keyword()) :: Agent.on_start()
```

Starts the registry for runtime filetype overrides.

---

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