sval-rs / value-bag

Dynamic structured values for Rust
Apache License 2.0
27 stars 3 forks source link

Visitors for sequences and maps #73

Closed KodrAus closed 9 months ago

KodrAus commented 10 months ago

It would be helpful to have some way to visit the elements of sequences. Something like:

pub trait Visitor<'v> {
    fn visit_sequence(&mut self, value: Sequence) -> Result<(), Error> {
        self.visit_any(value.as_value_bag())
    }

    fn visit_borrowed_sequence(&mut self, value: Sequence<'v>) -> Result<(), Error> {
        self.visit_sequence(value)
    }
}

pub trait SequenceVisitor<'v> {
    fn visit_elem(&mut self, elem: ValueBag) -> Result<(), Error>;

    fn visit_borrowed_elem(&mut self, elem: ValueBag<'v>) -> Result<(), Error> {
        self.visit_elem(elem)
    }
}

pub struct Sequence<'v>(ValueBag<'v>);

impl<'v> Sequence<'v> {
    pub fn as_value_bag(&self) -> ValueBag {
        self.0.by_ref()
    }

    pub fn visit(&self, visitor: impl SequenceVisitor<'v>) -> Result<(), Error> { .. }
}

For sval, we can't guarantee elements are primitive types unless we have alloc available.

This is just a sketch, but seems worth exploring.