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 a = vec![true, false, true];
let mut builder = ArrayBuilder::default();
IterWalker::new(a).walk_once(builder.as_visitor());
dbg!(builder.build());
todo!()
}
#[no_mangle]
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)]
struct ArrayBuilder([Option<bool>; 3]);
impl<'ctx> Builder<'ctx> for ArrayBuilder {
type Error = ();
type Value = [bool; 3];
fn as_visitor(&mut self) -> &mut dyn uniserde::protocol::Implementer<'ctx> {
self
}
fn build(self) -> Result<Self::Value, Self::Error> {
Ok([self.0[0].unwrap(), self.0[1].unwrap(), self.0[2].unwrap()])
}
}
implementer! {
impl['ctx] ArrayBuilder = [sequence::Sequence];
}
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
}
}