1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
use valuable::*;
struct HelloWorld {
hello: &'static str,
world: World,
}
struct World {
answer: usize,
}
static HELLO_WORLD_FIELDS: &[NamedField<'static>] =
&[NamedField::new("hello"), NamedField::new("world")];
impl Structable for HelloWorld {
fn definition(&self) -> StructDef<'_> {
StructDef::new_static("HelloWorld", Fields::Named(HELLO_WORLD_FIELDS))
}
}
impl Valuable for HelloWorld {
fn as_value(&self) -> Value<'_> {
Value::Structable(self)
}
fn visit(&self, v: &mut dyn Visit) {
v.visit_named_fields(&NamedValues::new(
HELLO_WORLD_FIELDS,
&[Value::String(self.hello), Value::Structable(&self.world)],
));
}
}
static WORLD_FIELDS: &[NamedField<'static>] = &[NamedField::new("answer")];
impl Valuable for World {
fn as_value(&self) -> Value<'_> {
Value::Structable(self)
}
fn visit(&self, v: &mut dyn Visit) {
v.visit_named_fields(&NamedValues::new(
WORLD_FIELDS,
&[Value::Usize(self.answer)],
));
}
}
impl Structable for World {
fn definition(&self) -> StructDef<'_> {
StructDef::new_static("World", Fields::Named(WORLD_FIELDS))
}
}
fn main() {
let hello_world = HelloWorld {
hello: "wut",
world: World { answer: 42 },
};
let value = Value::Structable(&hello_world);
println!("{:#?}", value);
let slice = &[1, 2, 3][..];
let value = &slice as &dyn Valuable;
println!("{:?}", value);
}
|