varvedb 0.4.0

A high-performance, embedded, append-only event store for Rust.
Documentation
# VarveDB

VarveDB is a high-performance, embedded, append-only event store for Rust, powered by [LMDB](http://www.lmdb.tech/doc/) (via `heed`) and [rkyv](https://rkyv.org/).

It is designed for event sourcing, offering strongly-typed events, zero-copy deserialization, and optimistic concurrency control.

## Features

-   **Append-Only Log**: Immutable event history.
-   **Strongly Typed**: Events and metadata are defined by user structs.
-   **Zero-Copy**: Efficient access using `rkyv`.
-   **Optimistic Concurrency**: `ExpectedVersion` support for safer writes.
-   **Embedded**: Runs in-process, no external server required.

## Getting Started

Add `varvedb` to your `Cargo.toml`.

```toml
[dependencies]
varvedb = "0.2.1"
rkyv = "0.7" # Check version compatibility
serde = { version = "1.0", features = ["derive"] }
```

### Basic Usage

```rust
use varvedb::{Varve, Payload, ExpectedVersion};
use varvedb::traits::MetadataExt;
use rkyv::{Archive, Serialize, Deserialize};

#[derive(Archive, Serialize, Deserialize, Debug)]
#[archive(derive(Debug))]
#[archive(check_bytes)]
struct MyEvent {
    data: String,
}

#[derive(Archive, Serialize, Deserialize, Debug)]
#[archive(derive(Debug))]
#[archive(check_bytes)]
struct MyMetadata {
    stream_id: u128,
    version: u32,
}

impl MetadataExt for MyMetadata {
    fn stream_id(&self) -> u128 { self.stream_id }
    fn version(&self) -> u32 { self.version }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut db = Varve::open("my_db.mdb")?;

    let event = MyEvent { data: "Hello".into() };
    let metadata = MyMetadata { stream_id: 1, version: 1 };
    
    db.append(Payload::new(event, metadata), ExpectedVersion::Auto)?;

    for result in db.iter()? {
        println!("Event: {:?}", result?);
    }

    Ok(())
}
```

## Architecture

-   **Varve**: The main facade for interacting with the database.
-   **Storage**: Manages the LMDB environment.
-   **Processor**: A framework for consuming events and tracking progress.

## License

Mozilla Public License 2.0