# `Jido.Observe.EventContract`
[🔗](https://github.com/agentjido/jido/blob/v2.3.3/lib/jido/observe/event_contract.ex#L1)

Minimal helpers for validating custom telemetry event contracts.

Downstream packages can use this module to enforce stable required keys for
metadata and measurements before emitting namespaced events.

# `event_error`

```elixir
@type event_error() ::
  {:invalid_event_contract,
   %{
     event: event_prefix(),
     missing_metadata_keys: required_keys(),
     missing_measurement_keys: required_keys()
   }}
```

# `event_prefix`

```elixir
@type event_prefix() :: [atom()]
```

# `key`

```elixir
@type key() :: atom() | String.t()
```

# `measurements_error`

```elixir
@type measurements_error() :: {:missing_measurement_keys, required_keys()}
```

# `metadata_error`

```elixir
@type metadata_error() :: {:missing_metadata_keys, required_keys()}
```

# `required_keys`

```elixir
@type required_keys() :: [key()]
```

# `validate_event`

```elixir
@spec validate_event(event_prefix(), map(), map(), keyword()) ::
  {:ok, %{event: event_prefix(), measurements: map(), metadata: map()}}
  | {:error, event_error()}
```

Validates event metadata and measurements against required keys.

## Options

- `:required_metadata` - Required metadata keys.
- `:required_measurements` - Required measurement keys.

# `validate_measurements`

```elixir
@spec validate_measurements(map(), required_keys()) ::
  {:ok, map()} | {:error, measurements_error()}
```

Validates that measurements contain all required keys.

# `validate_metadata`

```elixir
@spec validate_metadata(map(), required_keys()) ::
  {:ok, map()} | {:error, metadata_error()}
```

Validates that metadata contains all required keys.

