README.md

# Trogon.TypeProvider

**A compile-time type mapping system that converts between string type names and Elixir struct modules with zero
runtime overhead.**

**`Trogon.TypeProvider` generates efficient pattern-matching functions at compile time to bidirectionally map string
identifiers to Elixir structs**. It provides a clean tuple-based API that returns `{:ok, result}` for successful mappings
and `{:error, error}` for failures, ensuring predictable error handling throughout your application.

**This solves the common need for type serialization and deserialization in event-driven architectures, message queues,
and data persistence layers**. Instead of maintaining manual mapping logic or runtime lookups, `Trogon.TypeProvider`
automatically generates optimized functions that handle the conversion between human-readable type names and your
application's struct modules.

**`Trogon.TypeProvider` is particularly useful for developers building event sourcing systems, CQRS applications, or
any system that needs to serialize domain events and commands**. It's ideal for teams working with Commanded,
EventStore, or custom event-driven architectures where type safety and performance are critical requirements.

## Usage

### Basic TypeProvider

```elixir
defmodule MyApp.TypeProvider do
  use Trogon.TypeProvider

  # Register individual types
  register_type "user_created", MyApp.UserCreated
  register_type "user_updated", MyApp.UserUpdated
  register_type "user_deleted", MyApp.UserDeleted
end
```

### TypeProvider with Prefix

```elixir
defmodule MyApp.AccountTypeProvider do
  use Trogon.TypeProvider, prefix: "accounts."

  register_type "created", MyApp.AccountCreated
  register_type "updated", MyApp.AccountUpdated
  # Results in types: "accounts.created", "accounts.updated"
end
```

### Importing from Other TypeProviders

```elixir
defmodule MyApp.GlobalTypeProvider do
  use Trogon.TypeProvider

  # Import all types from other providers
  import_type_provider MyApp.UserTypeProvider
  import_type_provider MyApp.AccountTypeProvider

  # Add additional types
  register_type "system_started", MyApp.Events.SystemStarted
end
```