Skip to main content

README.md

# RustlerMatchSpec

Erlang-style match specifications for Rustler NIFs.

`RustlerMatchSpec` provides a small Elixir DSL and a Rust evaluator for selecting
and projecting compact native events without exposing large native data
structures to the BEAM.

## Usage

```elixir
import RustlerMatchSpec

spec =
  match_spec do
    {:event, kind, value} when kind in [:import, :url] ->
      {kind, value}
  end

RustlerMatchSpec.select([
  {:event, :import, "./app.js"},
  {:event, :env, "MODE"},
  {:event, :url, "./font.woff2"}
], spec)
#=> [{:import, "./app.js"}, {:url, "./font.woff2"}]
```

For repeated use, compile once:

```elixir
selector = RustlerMatchSpec.compile(spec)
RustlerMatchSpec.select(events, selector)
```

The macro compiles to plain match-spec-shaped data:

```elixir
[{match_head, match_guards, match_body}]
```

## Native integration

Rust NIF crates can implement `MatchEvent` for their own event types and reuse
the same selector evaluator. This lets a NIF match tuple-shaped patterns such as
`{:event, kind, value}` without allocating whole intermediate event tuples.

Use cases include parser events, trace events, resource metadata, or any native
stream where Elixir should decide which compact facts to keep.

## Development

```sh
mix deps.get
mix ci
```