Diffstat (limited to 'tests/demo.rs')
| -rw-r--r-- | tests/demo.rs | 77 |
1 files changed, 35 insertions, 42 deletions
diff --git a/tests/demo.rs b/tests/demo.rs index 81b4875..65b1083 100644 --- a/tests/demo.rs +++ b/tests/demo.rs @@ -1,70 +1,63 @@ -use uniserde::{transform::from, build::{Builder, Build}, Visitor, ControlFlow, protocol::{ProtocolId, AnyVisit, Visit}, protocols::sequence, impls::core::iterator::IterWalker, Walker}; +use std::any::TypeId; + +use uniserde::{ + Build, Builder, + impls::core::iterator::IterWalker, + protocol::{implementer, AnyImpl, Implementation, Implementer}, + protocols::{sequence, ControlFlow}, + transform, + WalkOnce, +}; #[test] fn demo() { - let x = ["1", "2", "3"]; + let a = vec![true, false, true]; - let mut builder = VecBuilder::default(); - IterWalker::new(x.iter()).walk(builder.as_visitor()); + let mut builder = ArrayBuilder::default(); + IterWalker::new(a).walk_once(builder.as_visitor()); dbg!(builder.build()); - todo!(); + todo!() } #[no_mangle] -pub fn example<'a>(x: &'a str) -> &'a str { - from(x).unwrap() +fn example(a: [bool; 3]) -> [bool; 3] { + let mut builder = ArrayBuilder::default(); + let _ = IterWalker::new(a).walk_once(builder.as_visitor()); + builder.build().unwrap() } #[derive(Default)] -pub struct VecBuilder(Vec<&'static str>); +struct ArrayBuilder([Option<bool>; 3]); -impl Builder<'static> for VecBuilder { +impl<'ctx> Builder<'ctx> for ArrayBuilder { type Error = (); - type Value = Vec<&'static str>; + type Value = [bool; 3]; - fn as_visitor(&mut self) -> &mut dyn uniserde::Visitor<'static> { + fn as_visitor(&mut self) -> &mut dyn uniserde::protocol::Implementer<'ctx> { self } fn build(self) -> Result<Self::Value, Self::Error> { - Ok(self.0) + Ok([self.0[0].unwrap(), self.0[1].unwrap(), self.0[2].unwrap()]) } } -impl Visitor<'static> for VecBuilder { - fn request_hint( - &mut self, - _hints: &mut dyn uniserde::WalkerHints<'static>, - _need_hint: bool, - ) -> uniserde::ControlFlow { - ControlFlow::Continue - } - - fn protocol(&mut self, id: uniserde::protocol::ProtocolId) -> Option<uniserde::protocol::AnyVisit<'_, 'static>> { - if id == ProtocolId::of::<sequence::Sequence>() { - Some(AnyVisit::new(self)) - } else { - None - } - } +implementer! { + impl['ctx] ArrayBuilder = [sequence::Sequence]; } -impl Visit<'static, sequence::Sequence> for VecBuilder { - fn visit(&mut self, accessor: <sequence::Sequence as uniserde::protocol::Protocol>::Accessor<'_, 'static>) -> ControlFlow { - loop { - let mut builder = <&'static str as Build<'static>>::Builder::default(); - match accessor.next(builder.as_visitor()) { - ControlFlow::Continue => {}, - ControlFlow::Done => {}, - ControlFlow::Error => break ControlFlow::Error, - } - - match builder.build() { - Ok(value) => self.0.push(value), - Err(err) => break ControlFlow::Error, - } +impl<'ctx> sequence::Object<'ctx> for ArrayBuilder { + fn visit( + &mut self, + accessor: &mut dyn sequence::Accessor<'ctx>, + ) -> uniserde::protocols::ControlFlow { + for slot in &mut self.0 { + let mut builder = <bool as Build>::Builder::default(); + accessor.next(builder.as_visitor()); + *slot = Some(builder.build().unwrap()); } + ControlFlow::Done } } |