3 unstable releases
| 0.1.1 | Jan 17, 2025 |
|---|---|
| 0.1.0 | Jan 3, 2022 |
| 0.0.0 | Mar 9, 2021 |
#866 in Debugging
10,773,854 downloads per month
Used in 19,851 crates
(47 directly)
130KB
1.5K
SLoC
Valuable
Valuable provides object-safe value inspection. Use cases include passing structured data to trait objects and object-safe serialization.
License
This project is licensed under the MIT license.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Valuable by you, shall be licensed as MIT, without any additional terms or conditions.
lib.rs:
Valuable provides object-safe value inspection. Use cases include passing structured data to trait objects and object-safe serialization.
Getting started
First, derive [Valuable][macro@crate::Valuable] on your types.
use valuable::Valuable;
#[derive(Valuable)]
struct HelloWorld {
message: Message,
}
#[derive(Valuable)]
enum Message {
HelloWorld,
Custom(String),
}
Then, implement a [visitor][Visit] to inspect the data.
use valuable::{NamedValues, Value, Valuable, Visit};
struct Print;
impl Visit for Print {
fn visit_value(&mut self, value: Value<'_>) {
match value {
Value::Structable(v) => {
println!("struct {}", v.definition().name());
v.visit(self);
}
Value::Enumerable(v) => {
println!("enum {}::{}", v.definition().name(), v.variant().name());
v.visit(self);
}
Value::Listable(v) => {
println!("list");
v.visit(self);
}
Value::Mappable(v) => {
println!("map");
v.visit(self);
}
_ => {
println!("value {:?}", value);
}
}
}
fn visit_named_fields(&mut self, named_fields: &NamedValues<'_>) {
for (field, value) in named_fields.iter() {
println!("named field {}", field.name());
value.visit(self);
}
}
fn visit_unnamed_fields(&mut self, values: &[Value<'_>]) {
for value in values {
value.visit(self);
}
}
fn visit_entry(&mut self, key: Value<'_>, value: Value<'_>) {
println!("key / value");
key.visit(self);
value.visit(self);
}
}
Then, use the visitor to visit the value.
let hello_world = HelloWorld { message: Message::HelloWorld };
hello_world.visit(&mut Print);
Related Crates
valuable-serdeprovides a bridge betweenvaluableand theserdeserialization ecosystem. Usingvaluable_serde::Serializableallows any type that implementsValuableto be serialized by anyserde::ser::Serializer.
Dependencies
~79KB