69 lines
1.5 KiB
Rust
69 lines
1.5 KiB
Rust
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);
|
|
}
|