Diffstat (limited to 'tests/demo.rs')
-rw-r--r--tests/demo.rs77
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
}
}