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);
}
|