#![feature(min_specialization)]
use specialized_dispatch::specialized_dispatch;
trait Deserializer<'de> {
type Error;
}
trait Deserialize<'de>: Sized {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>;
}
#[derive(Debug)]
struct MyAwesomeNode;
struct MyAwesomeDeserializer;
impl MyAwesomeDeserializer {
fn my_awesome_function(&mut self) -> MyAwesomeNode {
MyAwesomeNode
}
}
impl Deserializer<'_> for MyAwesomeDeserializer {
type Error = ();
}
impl<'de> Deserialize<'de> for MyAwesomeNode {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(specialized_dispatch! {
D -> MyAwesomeNode,
default fn <T>(_deserializer: T) => {
unimplemented!()
},
fn (mut deserializer: MyAwesomeDeserializer) => {
deserializer.my_awesome_function()
},
deserializer
})
}
}
fn main() {
println!("{:?}", MyAwesomeNode::deserialize(MyAwesomeDeserializer));
}