diff --git a/implementations/rust/preserves-schema/src/compiler/mod.rs b/implementations/rust/preserves-schema/src/compiler/mod.rs index c249d49..ba3f193 100644 --- a/implementations/rust/preserves-schema/src/compiler/mod.rs +++ b/implementations/rust/preserves-schema/src/compiler/mod.rs @@ -11,8 +11,9 @@ use crate::syntax::block::Formatter; use crate::syntax::block::constructors::*; use glob::glob; +use preserves::value::BinarySource; +use preserves::value::IOBinarySource; use preserves::value::Map; -use preserves::value::PackedReader; use preserves::value::Reader; use preserves::value::Set; @@ -54,7 +55,8 @@ impl CompilerConfig { pub fn load_schemas_and_bundles(&mut self, inputs: &Vec) -> Result<(), Error> { for i in inputs { let mut f = File::open(&i)?; - let mut reader = PackedReader::decode_read(&mut f); + let mut src = IOBinarySource::new(&mut f); + let mut reader = src.packed_iovalues(); let blob = reader.demand_next(false)?; if let Ok(s) = Schema::try_from(&blob) { diff --git a/implementations/rust/preserves-schema/src/lib.rs b/implementations/rust/preserves-schema/src/lib.rs index 26d3a70..6519734 100644 --- a/implementations/rust/preserves-schema/src/lib.rs +++ b/implementations/rust/preserves-schema/src/lib.rs @@ -31,13 +31,14 @@ mod tests { #[test] fn metaschema_parsing() -> Result<(), std::io::Error> { - use preserves::value::{Reader, IOValue}; + use preserves::value::{BinarySource, IOBinarySource, IOValue, Reader}; use std::convert::TryFrom; use std::convert::From; use crate::gen::schema::*; let mut f = std::fs::File::open("../../../schema/schema.bin")?; - let mut reader = preserves::value::PackedReader::decode_read(&mut f); + let mut src = IOBinarySource::new(&mut f); + let mut reader = src.packed_iovalues(); let schema = reader.demand_next(false)?; let parsed = Schema::try_from(&schema).expect("successful parse"); assert_eq!(schema, IOValue::from(&parsed)); diff --git a/implementations/rust/preserves-schema/src/support/mod.rs b/implementations/rust/preserves-schema/src/support/mod.rs index 430797f..fce6074 100644 --- a/implementations/rust/preserves-schema/src/support/mod.rs +++ b/implementations/rust/preserves-schema/src/support/mod.rs @@ -6,6 +6,7 @@ use preserves::value::Embeddable; use preserves::value::IOResult; use preserves::value::IOValue; use preserves::value::NestedValue; +use preserves::value::NoEmbeddedDomainDecode; use preserves::value::Value; use std::convert::From; @@ -13,9 +14,7 @@ use std::convert::TryFrom; use std::sync::Arc; pub fn decode_lit>(bs: &[u8]) -> IOResult { - preserves::value::packed::from_bytes(bs).unwrap().copy_via( - &mut |_| Err(std::io::Error::new(std::io::ErrorKind::Unsupported, - "Embedded values not supported in schema literals"))) + preserves::value::packed::from_bytes(bs, NoEmbeddedDomainDecode) } pub fn decode_embedded( diff --git a/implementations/rust/preserves/Cargo.toml b/implementations/rust/preserves/Cargo.toml index d308478..09a32a7 100644 --- a/implementations/rust/preserves/Cargo.toml +++ b/implementations/rust/preserves/Cargo.toml @@ -15,7 +15,6 @@ gitlab = { repository = "preserves/preserves" } num = "0.2" serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11" -lazy_static = "1.4.0" [dev-dependencies] criterion = "0.3" diff --git a/implementations/rust/preserves/examples/extensibility.rs b/implementations/rust/preserves/examples/extensibility.rs index 7ee10df..31b96e2 100644 --- a/implementations/rust/preserves/examples/extensibility.rs +++ b/implementations/rust/preserves/examples/extensibility.rs @@ -1,4 +1,4 @@ -use preserves::{de, value::{self, Reader, PackedReader}}; +use preserves::{de, value::{self, Reader, IOBinarySource, BinarySource}}; use serde::{Serialize, Deserialize}; use std::fs::File; use std::io::Error; @@ -33,7 +33,7 @@ enum Variety { } fn try_file(kind: &str, path: &str) -> Result<(), Error> { - let fruits_value = PackedReader::decode_read(&mut File::open(path)?).demand_next(true)?; + let fruits_value = IOBinarySource::new(&mut File::open(path)?).packed_iovalues().demand_next(true)?; println!("{:?}", fruits_value); let fruits1: Vec = value::de::from_value(&fruits_value)?; diff --git a/implementations/rust/preserves/src/de.rs b/implementations/rust/preserves/src/de.rs index 10f450a..40b4117 100644 --- a/implementations/rust/preserves/src/de.rs +++ b/implementations/rust/preserves/src/de.rs @@ -1,15 +1,17 @@ use serde::Deserialize; use serde::de::{Visitor, SeqAccess, MapAccess, EnumAccess, VariantAccess, DeserializeSeed}; + use std::borrow::Cow; use std::marker::PhantomData; -use super::value::PackedReader; + +use super::value::{IOValue, IOValueDomainDecode, PackedReader}; use super::value::reader::{Reader, IOBinarySource, BytesBinarySource}; pub use super::error::Error; pub type Result = std::result::Result; -pub struct Deserializer<'de, 'r, R: Reader<'de>> { +pub struct Deserializer<'de, 'r, R: Reader<'de, IOValue, IOValue>> { pub read: &'r mut R, phantom: PhantomData<&'de ()>, } @@ -19,7 +21,7 @@ pub fn from_bytes<'de, T>(bytes: &'de [u8]) -> where T: Deserialize<'de> { - from_reader(&mut PackedReader::new(BytesBinarySource::new(bytes))) + from_reader(&mut PackedReader::new(&mut BytesBinarySource::new(bytes), IOValueDomainDecode)) } pub fn from_read<'de, 'r, IOR: std::io::Read, T>(read: &'r mut IOR) -> @@ -27,10 +29,10 @@ pub fn from_read<'de, 'r, IOR: std::io::Read, T>(read: &'r mut IOR) -> where T: Deserialize<'de> { - from_reader(&mut PackedReader::new(IOBinarySource::new(read))) + from_reader(&mut PackedReader::new(&mut IOBinarySource::new(read), IOValueDomainDecode)) } -pub fn from_reader<'r, 'de, R: Reader<'de>, T>(read: &'r mut R) -> +pub fn from_reader<'r, 'de, R: Reader<'de, IOValue, IOValue>, T>(read: &'r mut R) -> Result where T: Deserialize<'de> @@ -40,13 +42,13 @@ where Ok(t) } -impl<'r, 'de, R: Reader<'de>> Deserializer<'de, 'r, R> { +impl<'r, 'de, R: Reader<'de, IOValue, IOValue>> Deserializer<'de, 'r, R> { pub fn from_reader(read: &'r mut R) -> Self { Deserializer { read, phantom: PhantomData } } } -impl<'r, 'de, 'a, R: Reader<'de>> serde::de::Deserializer<'de> for &'a mut Deserializer<'de, 'r, R> +impl<'r, 'de, 'a, R: Reader<'de, IOValue, IOValue>> serde::de::Deserializer<'de> for &'a mut Deserializer<'de, 'r, R> { type Error = Error; @@ -258,11 +260,11 @@ impl<'r, 'de, 'a, R: Reader<'de>> serde::de::Deserializer<'de> for &'a mut Deser } } -pub struct Seq<'de, 'r, 'a, R: Reader<'de>> { +pub struct Seq<'de, 'r, 'a, R: Reader<'de, IOValue, IOValue>> { de: &'a mut Deserializer<'de, 'r, R>, } -impl<'de, 'r, 'a, R: Reader<'de>> Seq<'de, 'r, 'a, R> { +impl<'de, 'r, 'a, R: Reader<'de, IOValue, IOValue>> Seq<'de, 'r, 'a, R> { fn new(de: &'a mut Deserializer<'de, 'r, R>) -> Self { Seq { de } } @@ -281,7 +283,7 @@ impl<'de, 'r, 'a, R: Reader<'de>> Seq<'de, 'r, 'a, R> { } } -impl<'de, 'r, 'a, R: Reader<'de>> SeqAccess<'de> for Seq<'de, 'r, 'a, R> { +impl<'de, 'r, 'a, R: Reader<'de, IOValue, IOValue>> SeqAccess<'de> for Seq<'de, 'r, 'a, R> { type Error = Error; fn next_element_seed(&mut self, seed: T) -> @@ -291,7 +293,7 @@ impl<'de, 'r, 'a, R: Reader<'de>> SeqAccess<'de> for Seq<'de, 'r, 'a, R> { } } -impl<'de, 'r, 'a, R: Reader<'de>> MapAccess<'de> for Seq<'de, 'r, 'a, R> { +impl<'de, 'r, 'a, R: Reader<'de, IOValue, IOValue>> MapAccess<'de> for Seq<'de, 'r, 'a, R> { type Error = Error; fn next_key_seed(&mut self, seed: K) -> @@ -310,7 +312,7 @@ impl<'de, 'r, 'a, R: Reader<'de>> MapAccess<'de> for Seq<'de, 'r, 'a, R> { } } -impl<'de, 'r, 'a, R: Reader<'de>> EnumAccess<'de> for &'a mut Deserializer<'de, 'r, R> { +impl<'de, 'r, 'a, R: Reader<'de, IOValue, IOValue>> EnumAccess<'de> for &'a mut Deserializer<'de, 'r, R> { type Error = Error; type Variant = Seq<'de, 'r, 'a, R>; @@ -323,7 +325,7 @@ impl<'de, 'r, 'a, R: Reader<'de>> EnumAccess<'de> for &'a mut Deserializer<'de, } } -impl<'de, 'r, 'a, R: Reader<'de>> VariantAccess<'de> for Seq<'de, 'r, 'a, R> { +impl<'de, 'r, 'a, R: Reader<'de, IOValue, IOValue>> VariantAccess<'de> for Seq<'de, 'r, 'a, R> { type Error = Error; fn unit_variant(mut self) -> Result<()> { diff --git a/implementations/rust/preserves/src/lib.rs b/implementations/rust/preserves/src/lib.rs index 3533ae5..1b3fc5f 100644 --- a/implementations/rust/preserves/src/lib.rs +++ b/implementations/rust/preserves/src/lib.rs @@ -1,6 +1,3 @@ -#[macro_use] -extern crate lazy_static; - pub mod de; pub mod ser; pub mod error; @@ -225,7 +222,7 @@ mod value_tests { #[cfg(test)] mod decoder_tests { - use crate::value::{Value, NestedValue, PackedReader, ConfiguredReader}; + use crate::value::{Value, NestedValue, BinarySource, BytesBinarySource, ConfiguredReader}; use crate::de::from_bytes; use crate::error::{Error, ExpectedKind, is_eof_io_error}; @@ -247,7 +244,8 @@ mod decoder_tests { #[test] fn skip_annotations_noskip() { let buf = &b"\x85\x92\x91"[..]; - let mut d = ConfiguredReader::new(PackedReader::decode_bytes(&buf)); + let mut src = BytesBinarySource::new(&buf); + let mut d = ConfiguredReader::new(src.packed_iovalues()); let v = d.demand_next().unwrap(); assert_eq!(v.annotations().slice().len(), 1); assert_eq!(v.annotations().slice()[0], Value::from(2).wrap()); @@ -256,7 +254,8 @@ mod decoder_tests { #[test] fn skip_annotations_skip() { let buf = &b"\x85\x92\x91"[..]; - let mut d = ConfiguredReader::new(PackedReader::decode_bytes(&buf)); + let mut src = BytesBinarySource::new(&buf); + let mut d = ConfiguredReader::new(src.packed_iovalues()); d.set_read_annotations(false); let v = d.demand_next().unwrap(); assert_eq!(v.annotations().slice().len(), 0); @@ -266,7 +265,8 @@ mod decoder_tests { #[test] fn multiple_values_buf_advanced() { let buf = &b"\xb4\xb3\x04Ping\x84\xb4\xb3\x04Pong\x84"[..]; assert_eq!(buf.len(), 16); - let mut d = ConfiguredReader::new(PackedReader::decode_bytes(&buf)); + let mut src = BytesBinarySource::new(&buf); + let mut d = ConfiguredReader::new(src.packed_iovalues()); assert_eq!(d.reader.source.index, 0); assert_eq!(d.demand_next().unwrap().value(), &Value::simple_record0("Ping")); assert_eq!(d.reader.source.index, 8); diff --git a/implementations/rust/preserves/src/value/domain.rs b/implementations/rust/preserves/src/value/domain.rs new file mode 100644 index 0000000..3866862 --- /dev/null +++ b/implementations/rust/preserves/src/value/domain.rs @@ -0,0 +1,24 @@ +use super::Embeddable; +use super::IOResult; +use super::IOValue; + +pub trait DomainDecode { + fn decode_embedded_iovalue(&mut self, v: IOValue) -> IOResult; +} + +pub struct IOValueDomainDecode; + +impl DomainDecode for IOValueDomainDecode { + fn decode_embedded_iovalue(&mut self, v: IOValue) -> IOResult { + Ok(v) + } +} + +pub struct NoEmbeddedDomainDecode; + +impl DomainDecode for NoEmbeddedDomainDecode { + fn decode_embedded_iovalue(&mut self, _v: IOValue) -> IOResult { + Err(std::io::Error::new(std::io::ErrorKind::Unsupported, + "Embedded values not supported here")) + } +} diff --git a/implementations/rust/preserves/src/value/mod.rs b/implementations/rust/preserves/src/value/mod.rs index f37f54c..cbf2f35 100644 --- a/implementations/rust/preserves/src/value/mod.rs +++ b/implementations/rust/preserves/src/value/mod.rs @@ -1,4 +1,5 @@ pub mod de; +pub mod domain; pub mod magic; pub mod packed; pub mod reader; @@ -9,9 +10,15 @@ pub mod writer; pub use de::Deserializer; pub use de::from_value; +pub use domain::DomainDecode; +pub use domain::IOValueDomainDecode; +pub use domain::NoEmbeddedDomainDecode; pub use packed::PackedReader; pub use packed::PackedWriter; +pub use reader::BinarySource; +pub use reader::BytesBinarySource; pub use reader::ConfiguredReader; +pub use reader::IOBinarySource; pub use reader::Reader; pub use repr::AnnotatedValue; pub use repr::ArcValue; @@ -32,10 +39,6 @@ pub use ser::Serializer; pub use ser::to_value; pub use writer::Writer; -pub use repr::FALSE; -pub use repr::TRUE; -pub use repr::EMPTY_SEQ; - pub type IOResult = std::result::Result; pub fn invert_map(m: &Map) -> Map diff --git a/implementations/rust/preserves/src/value/packed/mod.rs b/implementations/rust/preserves/src/value/packed/mod.rs index 952baba..e0368fd 100644 --- a/implementations/rust/preserves/src/value/packed/mod.rs +++ b/implementations/rust/preserves/src/value/packed/mod.rs @@ -5,12 +5,26 @@ pub mod writer; pub use reader::PackedReader; pub use writer::PackedWriter; -use super::{Reader, IOValue, IOResult}; +use super::{BinarySource, DomainDecode, Embeddable, IOResult, IOValue, IOValueDomainDecode, NestedValue, Reader}; -pub fn from_bytes(bs: &[u8]) -> IOResult { - PackedReader::decode_bytes(bs).demand_next(false) +pub fn from_bytes, Dec: DomainDecode>( + bs: &[u8], + decode_embedded: Dec, +) -> IOResult { + super::BytesBinarySource::new(bs).packed(decode_embedded).demand_next(false) } -pub fn annotated_from_bytes(bs: &[u8]) -> IOResult { - PackedReader::decode_bytes(bs).demand_next(true) +pub fn iovalue_from_bytes(bs: &[u8]) -> IOResult { + from_bytes(bs, IOValueDomainDecode) +} + +pub fn annotated_from_bytes, Dec: DomainDecode>( + bs: &[u8], + decode_embedded: Dec, +) -> IOResult { + super::BytesBinarySource::new(bs).packed(decode_embedded).demand_next(true) +} + +pub fn annotated_iovalue_from_bytes(bs: &[u8]) -> IOResult { + annotated_from_bytes(bs, IOValueDomainDecode) } diff --git a/implementations/rust/preserves/src/value/packed/reader.rs b/implementations/rust/preserves/src/value/packed/reader.rs index 64a11b6..08e9e5e 100644 --- a/implementations/rust/preserves/src/value/packed/reader.rs +++ b/implementations/rust/preserves/src/value/packed/reader.rs @@ -1,5 +1,8 @@ +use crate::error::{self, ExpectedKind, Received, is_eof_io_error, io_syntax_error}; + use num::bigint::BigInt; use num::traits::cast::{FromPrimitive, ToPrimitive}; + use std::borrow::Cow; use std::convert::TryFrom; use std::convert::TryInto; @@ -7,21 +10,19 @@ use std::marker::PhantomData; use super::constants::Tag; use super::super::{ - FALSE, + DomainDecode, + Embeddable, IOResult, - IOValue, + IOValueDomainDecode, Map, NestedValue, Record, Set, - TRUE, Value, reader::{ BinarySource, - BytesBinarySource, ConfiguredReader, - IOBinarySource, Reader, ReaderResult, }, @@ -29,14 +30,16 @@ use super::super::{ signed_integer::SignedInteger, }; -use crate::error::{self, ExpectedKind, Received, is_eof_io_error, io_syntax_error}; - -pub struct PackedReader<'de, S: BinarySource<'de>> { - pub source: S, - phantom: PhantomData<&'de ()>, +pub struct PackedReader<'de, 'src, D: Embeddable, N: NestedValue, Dec: DomainDecode, S: BinarySource<'de>> { + pub source: &'src mut S, + pub decode_embedded: Dec, + phantom: PhantomData<&'de (D, N)>, } -impl<'de, S: BinarySource<'de>> BinarySource<'de> for PackedReader<'de, S> { +impl<'de, 'src, D: Embeddable, N: NestedValue, Dec: DomainDecode, S: BinarySource<'de>> + BinarySource<'de> + for PackedReader<'de, 'src, D, N, Dec, S> +{ fn skip(&mut self) -> IOResult<()> { self.source.skip() } @@ -55,21 +58,9 @@ fn out_of_range>(i: I) -> error::Error { error::Error::NumberOutOfRange(i.into()) } -impl<'de> PackedReader<'de, BytesBinarySource<'de>> { - pub fn decode_bytes(bytes: &'de [u8]) -> Self { - PackedReader::new(BytesBinarySource::new(bytes)) - } -} - -impl<'de, 'a, IOR: std::io::Read> PackedReader<'de, IOBinarySource<'a, IOR>> { - pub fn decode_read(read: &'a mut IOR) -> Self { - PackedReader::new(IOBinarySource::new(read)) - } -} - -impl<'de, S: BinarySource<'de>> PackedReader<'de, S> { - pub fn new(source: S) -> Self { - PackedReader { source, phantom: PhantomData } +impl<'de, 'src, D: Embeddable, N: NestedValue, Dec: DomainDecode, S: BinarySource<'de>> PackedReader<'de, 'src, D, N, Dec, S> { + pub fn new(source: &'src mut S, decode_embedded: Dec) -> Self { + PackedReader { source, decode_embedded, phantom: PhantomData } } fn read(&mut self) -> IOResult { @@ -234,16 +225,19 @@ impl<'de, S: BinarySource<'de>> PackedReader<'de, S> { } } -impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { - fn next(&mut self, read_annotations: bool) -> IOResult> { +impl<'de, 'src, D: Embeddable, N: NestedValue, Dec: DomainDecode, S: BinarySource<'de>> + Reader<'de, D, N> + for PackedReader<'de, 'src, D, N, Dec, S> +{ + fn next(&mut self, read_annotations: bool) -> IOResult> { match self.peek() { Err(e) if is_eof_io_error(&e) => return Ok(None), Err(e) => return Err(e), Ok(_) => (), } Ok(Some(match Tag::try_from(self.read()?)? { - Tag::False => FALSE.clone(), - Tag::True => TRUE.clone(), + Tag::False => N::new(false), + Tag::True => N::new(true), Tag::Float => { let mut bs = [0; 4]; self.readbytes_into(&mut bs)?; @@ -263,7 +257,7 @@ impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { } let (existing_annotations, v) = self.demand_next(read_annotations)?.pieces(); annotations.extend_from_slice(existing_annotations.slice()); - IOValue::wrap(Annotations::new(Some(annotations)), v) + N::wrap(Annotations::new(Some(annotations)), v) } else { self.skip_value()?; while Tag::try_from(self.peek()?)? == Tag::Annotation { @@ -274,8 +268,8 @@ impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { } } Tag::Embedded => { - let v = self.demand_next(read_annotations)?; - Value::Embedded(v).wrap() + let v = PackedReader::new(self.source, IOValueDomainDecode).demand_next(read_annotations)?; + Value::Embedded(self.decode_embedded.decode_embedded_iovalue(v)?).wrap() } Tag::SmallInteger(v) => { // TODO: prebuild these in value.rs @@ -304,7 +298,7 @@ impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { } Tag::Record => { let iter = DelimitedStream { reader: self.configured(read_annotations) }; - let vs = iter.collect::>>()?; + let vs = iter.collect::>>()?; if vs.is_empty() { return Err(io_syntax_error("Too few elements in encoded record")) } @@ -312,7 +306,7 @@ impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { } Tag::Sequence => { let iter = DelimitedStream { reader: self.configured(read_annotations) }; - let vs = iter.collect::>>()?; + let vs = iter.collect::>>()?; Value::Sequence(vs).wrap() } Tag::Set => { @@ -450,13 +444,21 @@ impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { } } -struct DelimitedStream<'a, 'de, S: BinarySource<'de>> { - reader: ConfiguredReader<'de, &'a mut PackedReader<'de, S>>, +struct DelimitedStream + <'a, 'de, 'src, + D: Embeddable, + N: NestedValue, + Dec: DomainDecode, + S: BinarySource<'de>> +{ + reader: ConfiguredReader<'de, D, N, &'a mut PackedReader<'de, 'src, D, N, Dec, S>>, } -impl<'a, 'de, S: BinarySource<'de>> Iterator for DelimitedStream<'a, 'de, S> +impl<'a, 'de, 'src, D: Embeddable, N: NestedValue, Dec: DomainDecode, S: BinarySource<'de>> + Iterator + for DelimitedStream<'a, 'de, 'src, D, N, Dec, S> { - type Item = IOResult; + type Item = IOResult; fn next(&mut self) -> Option { match self.reader.reader.peekend() { Err(e) => Some(Err(e)), diff --git a/implementations/rust/preserves/src/value/reader.rs b/implementations/rust/preserves/src/value/reader.rs index b8114da..553e5bf 100644 --- a/implementations/rust/preserves/src/value/reader.rs +++ b/implementations/rust/preserves/src/value/reader.rs @@ -1,14 +1,15 @@ +use crate::error::{self, ExpectedKind, Received, io_eof}; + use std::borrow::Cow; use std::io::Read; use std::marker::PhantomData; -use super::repr::{NestedValue, IOValue}; -use super::IOResult; -use crate::error::{self, ExpectedKind, Received, io_eof}; + +use super::{DomainDecode, Embeddable, IOResult, IOValue, IOValueDomainDecode, NestedValue}; pub type ReaderResult = std::result::Result; -pub trait Reader<'de> { - fn next(&mut self, read_annotations: bool) -> IOResult>; +pub trait Reader<'de, D: Embeddable, N: NestedValue> { + fn next(&mut self, read_annotations: bool) -> IOResult>; fn open_record(&mut self, arity: Option) -> ReaderResult<()>; fn open_sequence_or_set(&mut self) -> ReaderResult<()>; fn open_sequence(&mut self) -> ReaderResult<()>; @@ -26,7 +27,7 @@ pub trait Reader<'de> { Ok(()) } - fn demand_next(&mut self, read_annotations: bool) -> IOResult { + fn demand_next(&mut self, read_annotations: bool) -> IOResult { self.next(read_annotations)?.ok_or_else(io_eof) } @@ -81,7 +82,7 @@ pub trait Reader<'de> { } } - fn configured(self, read_annotations: bool) -> ConfiguredReader<'de, Self> + fn configured(self, read_annotations: bool) -> ConfiguredReader<'de, D, N, Self> where Self: std::marker::Sized { @@ -116,8 +117,11 @@ pub trait Reader<'de> { } } -impl<'r, 'de, R: Reader<'de>> Reader<'de> for &'r mut R { - fn next(&mut self, read_annotations: bool) -> IOResult> { +impl<'r, 'de, D: Embeddable, N: NestedValue, R: Reader<'de, D, N>> + Reader<'de, D, N> + for &'r mut R +{ + fn next(&mut self, read_annotations: bool) -> IOResult> { (*self).next(read_annotations) } @@ -155,11 +159,24 @@ impl<'r, 'de, R: Reader<'de>> Reader<'de> for &'r mut R { } -pub trait BinarySource<'de> { +pub trait BinarySource<'de>: Sized { fn skip(&mut self) -> IOResult<()>; fn peek(&mut self) -> IOResult; fn readbytes(&mut self, count: usize) -> IOResult>; fn readbytes_into(&mut self, bs: &mut [u8]) -> IOResult<()>; + + fn packed, Dec: DomainDecode>( + &mut self, + decode_embedded: Dec, + ) -> super::PackedReader<'de, '_, D, N, Dec, Self> { + super::PackedReader::new(self, decode_embedded) + } + + fn packed_iovalues(&mut self) -> + super::PackedReader<'de, '_, IOValue, IOValue, IOValueDomainDecode, Self> + { + self.packed(IOValueDomainDecode) + } } pub struct IOBinarySource<'a, R: Read> { @@ -258,13 +275,13 @@ impl<'de> BinarySource<'de> for BytesBinarySource<'de> { } } -pub struct ConfiguredReader<'de, R: Reader<'de>> { +pub struct ConfiguredReader<'de, D: Embeddable, N: NestedValue, R: Reader<'de, D, N>> { pub reader: R, pub read_annotations: bool, - phantom: PhantomData<&'de ()>, + phantom: PhantomData<&'de (D, N)>, } -impl<'de, R: Reader<'de>> ConfiguredReader<'de, R> { +impl<'de, D: Embeddable, N: NestedValue, R: Reader<'de, D, N>> ConfiguredReader<'de, D, N, R> { pub fn new(reader: R) -> Self { reader.configured(true) } @@ -273,13 +290,16 @@ impl<'de, R: Reader<'de>> ConfiguredReader<'de, R> { self.read_annotations = read_annotations } - pub fn demand_next(&mut self) -> IOResult { + pub fn demand_next(&mut self) -> IOResult { self.reader.demand_next(self.read_annotations) } } -impl<'de, R: Reader<'de>> std::iter::Iterator for ConfiguredReader<'de, R> { - type Item = IOResult; +impl<'de, D: Embeddable, N: NestedValue, R: Reader<'de, D, N>> + std::iter::Iterator + for ConfiguredReader<'de, D, N, R> +{ + type Item = IOResult; fn next(&mut self) -> Option { match self.reader.next(self.read_annotations) { Err(e) => Some(Err(e)), diff --git a/implementations/rust/preserves/src/value/repr.rs b/implementations/rust/preserves/src/value/repr.rs index adbd97b..ddf44be 100644 --- a/implementations/rust/preserves/src/value/repr.rs +++ b/implementations/rust/preserves/src/value/repr.rs @@ -1046,12 +1046,6 @@ impl Debug for ArcValue { pub struct IOValue(Arc>); pub type UnwrappedIOValue = Value; -lazy_static! { - pub static ref FALSE: IOValue = IOValue(Arc::new(AnnotatedValue(Annotations::empty(), Value::Boolean(false)))); - pub static ref TRUE: IOValue = IOValue(Arc::new(AnnotatedValue(Annotations::empty(), Value::Boolean(true)))); - pub static ref EMPTY_SEQ: IOValue = IOValue(Arc::new(AnnotatedValue(Annotations::empty(), Value::Sequence(Vec::new())))); -} - impl Domain for IOValue {} impl NestedValue for IOValue { diff --git a/implementations/rust/preserves/tests/samples_tests.rs b/implementations/rust/preserves/tests/samples_tests.rs index 06b77ee..b2db1ac 100644 --- a/implementations/rust/preserves/tests/samples_tests.rs +++ b/implementations/rust/preserves/tests/samples_tests.rs @@ -1,7 +1,9 @@ use preserves::error::{is_eof_io_error, is_syntax_io_error}; use preserves::symbol::Symbol; +use preserves::value::BinarySource; +use preserves::value::BytesBinarySource; +use preserves::value::IOBinarySource; use preserves::value::IOValue; -use preserves::value::PackedReader; use preserves::value::PackedWriter; use preserves::value::Reader; use preserves::value::de::from_value as deserialize_from_value; @@ -11,12 +13,13 @@ mod samples; use samples::*; fn decode_all(bytes: &'_ [u8]) -> Result, std::io::Error> { - PackedReader::decode_bytes(bytes).configured(true).collect() + BytesBinarySource::new(bytes).packed_iovalues().configured(true).collect() } #[test] fn run() -> std::io::Result<()> { let mut fh = std::fs::File::open("../../../tests/samples.bin").unwrap(); - let mut d = PackedReader::decode_read(&mut fh).configured(true); + let mut src = IOBinarySource::new(&mut fh); + let mut d = src.packed_iovalues().configured(true); let tests: TestCases = deserialize_from_value(&d.next().unwrap().unwrap()).unwrap(); // println!("{:#?}", tests); @@ -55,14 +58,14 @@ fn decode_all(bytes: &'_ [u8]) -> Result, std::io::Error> { } } TestCase::DecodeShort(ref bin) => { - assert!(if let Err(e) = PackedReader::decode_bytes(bin).configured(true).next().unwrap() { + assert!(if let Err(e) = BytesBinarySource::new(bin).packed_iovalues().configured(true).next().unwrap() { is_eof_io_error(&e) } else { false }) } TestCase::DecodeEOF(ref bin) => { - assert!(PackedReader::decode_bytes(bin).configured(true).next().is_none()); + assert!(BytesBinarySource::new(bin).packed_iovalues().configured(true).next().is_none()); } } }