sval
A prototype, lightweight, no-std, object-safe, serialization-only API for structured values with serde support.
Producers of structured values use the value module. Consumers of structured values use the stream module. sval offers a json-like data model, which is more limiting than serde's, but capable enough to represent Rust datastructures in one form or another.
This library is designed to plug a no-std-object-safe sized hole in Rust's current serialization ecosystem. The driving use-case is structured logging, where individual events are typically small, and there's no complete schema that can tie values in any one event to values in another.
sval_json and sval_derive are mostly pilfered from dtolnay's excellent miniserde project.
Minimum rustc
This library requires Rust 1.31.0.
See also
How to use it
Add sval to your crate dependencies:
[dependencies.sval]
version = "0.0.4"To support my datastructures
Simple struct-like datastructures can derive sval::Value:
[dependencies.sval]
features = ["derive"]#[macro_use]
extern crate sval;
#[derive(Value)]
struct MyData {
id: u64,
name: String,
}Other datastructures can implement sval::Value manually:
use sval::value::{self, Value};
struct MyId(u64);
impl Value for MyId {
fn stream(&self, stream: &mut value::Stream) -> Result<(), value::Error> {
stream.u64(self.0)
}
}To format my data
The sval_json crate can format any sval::Value as json:
[dependencies.sval_json]
version = "0.0.4"let my_json = sval_json::to_string(my_data)?;To integrate with serde
sval has out-of-the-box serde integration between sval::Values and serde::Serializes. Add the serde feature to sval to enable it:
[dependencies.sval]
features = ["serde"]Then convert between serde and sval:
let my_serialize = sval::serde::to_serialize(my_data);