From 8f1a83e54854a487a631449c8f7d2c2497a5df39 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Mon, 5 Jul 2021 11:50:40 +0200 Subject: [PATCH] Avoidance of hardcoded use of IOValue in Embedded reading --- .../rust/preserves/src/value/domain.rs | 26 ++++++++++++++----- .../rust/preserves/src/value/packed/reader.rs | 4 +-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/implementations/rust/preserves/src/value/domain.rs b/implementations/rust/preserves/src/value/domain.rs index 3866862..6500356 100644 --- a/implementations/rust/preserves/src/value/domain.rs +++ b/implementations/rust/preserves/src/value/domain.rs @@ -1,24 +1,38 @@ +use super::BinarySource; use super::Embeddable; use super::IOResult; use super::IOValue; +use super::Reader; +use super::packed::PackedReader; pub trait DomainDecode { - fn decode_embedded_iovalue(&mut self, v: IOValue) -> IOResult; + fn decode_embedded<'de, 'src, S: BinarySource<'de>>( + &mut self, + src: &'src mut S, + read_annotations: bool, + ) -> IOResult; } pub struct IOValueDomainDecode; impl DomainDecode for IOValueDomainDecode { - fn decode_embedded_iovalue(&mut self, v: IOValue) -> IOResult { - Ok(v) + fn decode_embedded<'de, 'src, S: BinarySource<'de>>( + &mut self, + src: &'src mut S, + read_annotations: bool, + ) -> IOResult { + PackedReader::new(src, IOValueDomainDecode).demand_next(read_annotations) } } 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")) + fn decode_embedded<'de, 'src, S: BinarySource<'de>>( + &mut self, + _src: &'src mut S, + _read_annotations: bool, + ) -> IOResult { + Err(std::io::Error::new(std::io::ErrorKind::Unsupported, "Embedded values not supported here")) } } diff --git a/implementations/rust/preserves/src/value/packed/reader.rs b/implementations/rust/preserves/src/value/packed/reader.rs index 08e9e5e..b127c1c 100644 --- a/implementations/rust/preserves/src/value/packed/reader.rs +++ b/implementations/rust/preserves/src/value/packed/reader.rs @@ -13,7 +13,6 @@ use super::super::{ DomainDecode, Embeddable, IOResult, - IOValueDomainDecode, Map, NestedValue, Record, @@ -268,8 +267,7 @@ impl<'de, 'src, D: Embeddable, N: NestedValue, Dec: DomainDecode, S: Binar } } Tag::Embedded => { - let v = PackedReader::new(self.source, IOValueDomainDecode).demand_next(read_annotations)?; - Value::Embedded(self.decode_embedded.decode_embedded_iovalue(v)?).wrap() + Value::Embedded(self.decode_embedded.decode_embedded(self.source, read_annotations)?).wrap() } Tag::SmallInteger(v) => { // TODO: prebuild these in value.rs