73 lines
2.2 KiB
Rust
73 lines
2.2 KiB
Rust
use std::borrow::Borrow;
|
|
use std::io;
|
|
use std::marker::PhantomData;
|
|
|
|
use crate::DomainDecode;
|
|
use crate::Reader;
|
|
use crate::DomainEncode;
|
|
use crate::ValueImpl;
|
|
use crate::Writer;
|
|
use crate::ValueReader;
|
|
|
|
pub struct IOValueDomainDecode<'de, V: ValueReader<'de>>(PhantomData<&'de V>);
|
|
pub struct IOValueDomainEncode<'de, V: ValueImpl<'de>>(PhantomData<&'de V>);
|
|
|
|
impl<'de, V: ValueReader<'de>> Default for IOValueDomainDecode<'de, V> { fn default() -> Self { Self(PhantomData) } }
|
|
impl<'de, V: ValueImpl<'de>> Default for IOValueDomainEncode<'de, V> { fn default() -> Self { Self(PhantomData) } }
|
|
|
|
impl<'de, V: ValueReader<'de>> DomainDecode<'de, <V::Impl as ValueImpl<'de>>::IOEmbedded> for IOValueDomainDecode<'de, V> {
|
|
fn decode_embedded<R: Reader<'de> + ?Sized>(
|
|
&mut self,
|
|
r: &mut R,
|
|
read_annotations: bool,
|
|
) -> io::Result<<V::Impl as ValueImpl<'de>>::IOEmbedded> {
|
|
Ok(V::read_iovalue(r, read_annotations)?)
|
|
}
|
|
}
|
|
|
|
impl<'de, V: ValueImpl<'de>> DomainEncode<'de, V::IOEmbedded> for IOValueDomainEncode<'de, V> {
|
|
fn encode_embedded(
|
|
&mut self,
|
|
w: &mut dyn Writer,
|
|
d: &V::IOEmbedded,
|
|
) -> io::Result<()> {
|
|
d.as_ref().borrow().write(w, self)
|
|
}
|
|
}
|
|
|
|
pub struct IOValues<'de, V: ValueReader<'de>, R: Reader<'de>> {
|
|
pub reader: R,
|
|
pub read_annotations: bool,
|
|
phantom: PhantomData<&'de V>,
|
|
}
|
|
|
|
impl<'de, V: ValueReader<'de>, R: Reader<'de>> IOValues<'de, V, R> {
|
|
pub fn new(reader: R) -> Self {
|
|
IOValues {
|
|
reader,
|
|
read_annotations: false,
|
|
phantom: PhantomData,
|
|
}
|
|
}
|
|
|
|
pub fn read_annotations(mut self, read_annotations: bool) -> Self {
|
|
self.read_annotations = read_annotations;
|
|
self
|
|
}
|
|
}
|
|
|
|
impl<'de, V: ValueReader<'de>, R: Reader<'de>> Iterator for IOValues<'de, V, R> {
|
|
type Item = io::Result<<V::Impl as ValueImpl<'de>>::IOEmbedded>;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
match self.reader.peek_class() {
|
|
Err(e) => Some(Err(e)),
|
|
Ok(None) => None,
|
|
Ok(Some(_)) => match V::read_iovalue(&mut self.reader, self.read_annotations) {
|
|
Ok(v) => Some(Ok(v)),
|
|
Err(e) => Some(Err(e.into())),
|
|
}
|
|
}
|
|
}
|
|
}
|