Packages

A Peep storage backend implemented as a Rust NIF.

Current section

Files

Jump to
peep_rs README.md
Raw

README.md

# Peep.Storage.RustNIF

A [Peep](https://github.com/rkallos/peep) storage backend implemented as a Rust
NIF via [Rustler](https://github.com/rusterlium/rustler).

`Peep.Storage.RustNIF` implements the `Peep.Storage` behaviour, so it can be
passed as the `:storage` option to `Peep.start_link/1`:

```elixir
Peep.start_link(
  name: :my_peep,
  metrics: metrics,
  storage: {Peep.Storage.RustNIF, []}
)
```

## Installation

Add `peep_rs` to your dependencies:

```elixir
{:peep_rs, "~> 0.1"}
```

It requires OTP 29. Compiling it downloads a NIF built for your platform from
the project's GitHub releases, so no Rust toolchain is needed. Precompiled NIFs
are published for x86_64 and aarch64 Linux (glibc and musl) and macOS.

To build the NIF from source instead, which needs Cargo, add
`{:rustler, "~> 0.38"}` to your dependencies and set `PEEP_RS_BUILD=1`.

## Development

`mix compile` builds the Rust crate under `native/peep_storage_rustler` when
`PEEP_RS_BUILD=1` is set. It requires Cargo and OTP 29 (`enif_term_size`, NIF
2.18). The Nix flake supplies Erlang, Elixir and Rust, and sets `PEEP_RS_BUILD`:

    direnv allow   # or: nix develop

Tests include Peep's shared storage suite and
`test/peep/storage/rust_nif_test.exs`:

    mix test

## Releasing

`scripts/release.sh` tags the version in `mix.exs`, waits for
`.github/workflows/release.yml` to build a NIF for each platform, publishes the
GitHub release, writes the checksum file and publishes to Hex. Bump the version
in `mix.exs` and `native/peep_storage_rustler/Cargo.toml` first.

    scripts/release.sh --dry-run   # print the commands a release would run
    scripts/release.sh