ratatouille 0.1.0

Best-effort telemetry firehose logger with bounded topic state
Documentation
# ratatouille

A zero-dependency Rust crate for best-effort telemetry firehose logging with topic filters, per-topic sequence counters, text or NDJSON formatting, and std-only HTTP/TCP sinks and relays.

## Features

- DEBUG-style allow/deny topic filters with `*` wildcards
- per-topic monotonic local sequence counters
- text and NDJSON output modes
- stdout sink, callback sink, and custom sink trait support
- plain `http://` sink plus bounded explicit-flush HTTP relay
- plain `tcp://host:port` sink plus bounded explicit-flush TCP relay
- zero external dependencies beyond Rust std

## Quick start

```rust
use ratatouille::{Format, Logger, LoggerConfig, SourceIdentity};

fn main() {
    let mut config = LoggerConfig::default();
    config.filter = Some("api*,-api:noise".into());
    config.format = Format::Ndjson;
    config.source = SourceIdentity {
        app: Some("example".into()),
        r#where: Some("rust".into()),
        instance: Some("local".into()),
    };

    let mut logger = Logger::new(config);
    let _ = logger.log("api", "hello from Rust");
}
```

## Transports

`HttpSink` and `HttpRelay` are intentionally minimal:

- `http://` only
- no TLS
- no background thread
- bounded in-memory relay queue
- explicit `flush_now()` for relay batch delivery

`TcpSink` and `TcpRelay` are similarly minimal:

- `tcp://host:port` only
- no background thread
- bounded in-memory relay queue
- explicit `flush_now()` for relay batch delivery

## Notes

- Logging is best-effort telemetry, not an audit trail.
- `LoggerConfig::default()` does not emit anything until a filter is configured.
- The shared behavioral contract lives in `contract/cases.tsv` in the repository root.