-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserdelike_example.rs
59 lines (49 loc) · 1.49 KB
/
serdelike_example.rs
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
#![feature(min_specialization)]
use specialized_dispatch::specialized_dispatch;
/// A simplified version of `serde::de::Deserializer`.
trait Deserializer<'de> {
type Error;
// Some generic deserializer functions...
}
/// A simplified version of `serde::de::Deserialize`.
trait Deserialize<'de>: Sized {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>;
}
/// The node type we want to deserialize.
#[derive(Debug)]
struct MyAwesomeNode;
/// Our custom deserializer.
struct MyAwesomeDeserializer;
impl MyAwesomeDeserializer {
fn my_awesome_function(&mut self) -> MyAwesomeNode {
MyAwesomeNode
}
}
impl Deserializer<'_> for MyAwesomeDeserializer {
type Error = ();
// Implement the generic deserializer functions...
}
impl<'de> Deserialize<'de> for MyAwesomeNode {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(specialized_dispatch! {
D -> MyAwesomeNode,
// TODO(ozars): This causes rustc ICE.
// default fn <'de, T: Deserializer<'de>>(_deserializer: T) => {
default fn <T>(_deserializer: T) => {
unimplemented!()
},
fn (mut deserializer: MyAwesomeDeserializer) => {
deserializer.my_awesome_function()
},
deserializer
})
}
}
fn main() {
println!("{:?}", MyAwesomeNode::deserialize(MyAwesomeDeserializer));
}