preserves/implementations/rust/preserves/src/iovalue.rs

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())),
}
}
}
}