diff --git a/implementations/rust/Cargo.toml b/implementations/rust/Cargo.toml index d7bd888..95980e3 100644 --- a/implementations/rust/Cargo.toml +++ b/implementations/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "preserves" -version = "0.2.3" +version = "0.3.0" authors = ["Tony Garnock-Jones "] edition = "2018" description = "Implementation of the Preserves serialization format via serde." diff --git a/implementations/rust/src/lib.rs b/implementations/rust/src/lib.rs index 1b63b94..acc9c43 100644 --- a/implementations/rust/src/lib.rs +++ b/implementations/rust/src/lib.rs @@ -1,13 +1,17 @@ pub mod value; pub mod symbol; +#[cfg(test)] +type Dom = (); + #[cfg(test)] mod ieee754_section_5_10_total_order_tests { use std::cmp::Ordering::{Less, Equal, Greater}; + use super::Dom; use crate::value::{Value, PlainValue}; - fn f(val: f32) -> Value { Value::from(val) } - fn d(val: f64) -> Value { Value::from(val) } + fn f(val: f32) -> Value, Dom> { Value::from(val) } + fn d(val: f64) -> Value, Dom> { Value::from(val) } // TODO: Test cases with a few different signalling and non-signalling NaNs @@ -99,8 +103,9 @@ mod ieee754_section_5_10_total_order_tests { mod value_tests { use crate::value::{Value, PlainValue}; use num::bigint::BigInt; + use super::Dom; - type VV = Value; + type VV = Value, Dom>; #[test] fn boolean_mut() { let mut b = VV::Boolean(true); @@ -179,10 +184,11 @@ mod value_tests { mod decoder_tests { use crate::value::Decoder; use crate::value::{Value, PlainValue, NestedValue}; + use super::Dom; #[test] fn read_123() { let mut buf = &b"abc"[..]; - let mut d = Decoder::<_, PlainValue>::new(&mut buf, None); + let mut d = Decoder::<_, PlainValue, Dom>::new(&mut buf, None); assert_eq!(d.read().ok(), Some(97)); assert_eq!(d.read().ok(), Some(98)); assert_eq!(d.read().ok(), Some(99)); @@ -191,7 +197,7 @@ mod decoder_tests { #[test] fn skip_annotations_noskip() { let mut buf = &b"\x0521"[..]; - let mut d = Decoder::<_, PlainValue>::new(&mut buf, None); + let mut d = Decoder::<_, PlainValue, Dom>::new(&mut buf, None); let v = d.next().unwrap(); assert_eq!(v.annotations().len(), 1); assert_eq!(v.annotations()[0], Value::from(2).wrap()); @@ -200,7 +206,7 @@ mod decoder_tests { #[test] fn skip_annotations_skip() { let mut buf = &b"\x0521"[..]; - let mut d = Decoder::<_, PlainValue>::new(&mut buf, None); + let mut d = Decoder::<_, PlainValue, Dom>::new(&mut buf, None); d.set_read_annotations(false); let v = d.next().unwrap(); assert_eq!(v.annotations().len(), 0); @@ -210,7 +216,7 @@ mod decoder_tests { #[test] fn two_values_at_once() { let mut buf = &b"\x81tPing\x81tPong"[..]; assert_eq!(buf.len(), 12); - let mut d = Decoder::<_, PlainValue>::new(&mut buf, None); + let mut d = Decoder::<_, PlainValue, Dom>::new(&mut buf, None); assert_eq!(d.next().unwrap().value(), &Value::simple_record("Ping", vec![])); assert_eq!(d.next().unwrap().value(), &Value::simple_record("Pong", vec![])); assert_eq!(buf.len(), 0); @@ -219,7 +225,7 @@ mod decoder_tests { #[test] fn buf_advanced() { let mut buf = &b"\x81tPing\x81tPong"[..]; assert_eq!(buf.len(), 12); - let mut d = Decoder::<_, PlainValue>::new(&mut buf, None); + let mut d = Decoder::<_, PlainValue, Dom>::new(&mut buf, None); assert_eq!(d.next().unwrap().value(), &Value::simple_record("Ping", vec![])); assert_eq!(buf.len(), 6); } @@ -233,9 +239,10 @@ mod samples_tests { use crate::value::DecodePlaceholderMap; use crate::value::to_value; use crate::value::from_value; + use super::Dom; #[derive(Debug, serde::Serialize, serde::Deserialize)] - struct ExpectedPlaceholderMapping(DecodePlaceholderMap); + struct ExpectedPlaceholderMapping(DecodePlaceholderMap, Dom>); #[derive(Debug, serde::Serialize, serde::Deserialize)] struct TestCases { @@ -245,9 +252,9 @@ mod samples_tests { #[derive(Debug, serde::Serialize, serde::Deserialize)] enum TestCase { - Test(#[serde(with = "serde_bytes")] Vec, PlainValue), - NondeterministicTest(#[serde(with = "serde_bytes")] Vec, PlainValue), - StreamingTest(#[serde(with = "serde_bytes")] Vec, PlainValue), + Test(#[serde(with = "serde_bytes")] Vec, PlainValue), + NondeterministicTest(#[serde(with = "serde_bytes")] Vec, PlainValue), + StreamingTest(#[serde(with = "serde_bytes")] Vec, PlainValue), ParseError(String), ParseShort(String), DecodeError(#[serde(with = "serde_bytes")] Vec), @@ -256,7 +263,7 @@ mod samples_tests { #[test] fn run() -> std::io::Result<()> { let mut fh = std::fs::File::open("../../tests/samples.bin").unwrap(); - let mut d = Decoder::<_, PlainValue>::new(&mut fh, None); + let mut d = Decoder::<_, PlainValue, Dom>::new(&mut fh, None); let tests: TestCases = from_value(&d.next().unwrap()).unwrap(); // println!("{:#?}", tests); @@ -312,7 +319,7 @@ mod samples_tests { #[serde(with = "serde_bytes")] &'a [u8], #[serde(with = "serde_bytes")] Vec, i16, - PlainValue); + PlainValue); let v = SimpleValue("hello".to_string(), "sym1".to_string(), Symbol("sym2".to_string()), @@ -322,7 +329,7 @@ mod samples_tests { 12345, Value::from("hi").wrap()); println!("{:#?}", v); - let w: PlainValue = to_value(&v).unwrap(); + let w: PlainValue = to_value(&v).unwrap(); println!("{:#?}", w); let x = from_value(&w).unwrap(); println!("{:#?}", &x); diff --git a/implementations/rust/src/symbol.rs b/implementations/rust/src/symbol.rs index f2e2b63..fb6b4ac 100644 --- a/implementations/rust/src/symbol.rs +++ b/implementations/rust/src/symbol.rs @@ -5,13 +5,13 @@ pub struct Symbol(pub String); impl serde::Serialize for Symbol { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - Value::::symbol(&self.0).wrap().serialize(serializer) + Value::, ()>::symbol(&self.0).wrap().serialize(serializer) } } impl<'de> serde::Deserialize<'de> for Symbol { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - let v = PlainValue::deserialize(deserializer)?; + let v = PlainValue::<()>::deserialize(deserializer)?; let s = v.value().as_symbol().ok_or_else(|| serde::de::Error::custom("Expected symbol"))?; Ok(Symbol(s.clone())) } diff --git a/implementations/rust/src/value/codec.rs b/implementations/rust/src/value/codec.rs index bb5d39e..55d5ac9 100644 --- a/implementations/rust/src/value/codec.rs +++ b/implementations/rust/src/value/codec.rs @@ -1,15 +1,15 @@ -use crate::value::{decoder, encoder, invert_map, NestedValue}; +use crate::value::{decoder, encoder, invert_map, NestedValue, Domain}; use decoder::{Decoder, DecodePlaceholderMap}; use encoder::{Encoder, EncodePlaceholderMap}; use std::io::{Read, Write}; -pub struct Codec { - pub decode_placeholders: Option>, - pub encode_placeholders: Option>, +pub struct Codec, D: Domain> { + pub decode_placeholders: Option>, + pub encode_placeholders: Option>, } -impl Codec { - pub fn new(decode_placeholders: DecodePlaceholderMap) -> Self { +impl, D: Domain> Codec { + pub fn new(decode_placeholders: DecodePlaceholderMap) -> Self { let encode_placeholders = Some(invert_map(&decode_placeholders)); Codec { decode_placeholders: Some(decode_placeholders), encode_placeholders } } @@ -18,11 +18,11 @@ impl Codec { Codec { decode_placeholders: None, encode_placeholders: None } } - pub fn decoder<'a, 'r, R: Read>(&'a self, read: &'r mut R) -> Decoder<'r, 'a, R, N> { + pub fn decoder<'a, 'r, R: Read>(&'a self, read: &'r mut R) -> Decoder<'r, 'a, R, N, D> { Decoder::new(read, self.decode_placeholders.as_ref()) } - pub fn encoder<'a, 'w, W: Write>(&'a self, write: &'w mut W) -> Encoder<'w, 'a, W, N> { + pub fn encoder<'a, 'w, W: Write>(&'a self, write: &'w mut W) -> Encoder<'w, 'a, W, N, D> { Encoder::new(write, self.encode_placeholders.as_ref()) } diff --git a/implementations/rust/src/value/de.rs b/implementations/rust/src/value/de.rs index 9d6e266..22db7d9 100644 --- a/implementations/rust/src/value/de.rs +++ b/implementations/rust/src/value/de.rs @@ -1,4 +1,4 @@ -use crate::value::{Value, NestedValue, Map}; +use crate::value::{Value, NestedValue, Map, Domain}; use crate::value::value::{Float, Double}; use crate::value::error::{Error, Result, ExpectedKind}; use num::traits::cast::ToPrimitive; @@ -6,33 +6,39 @@ use serde::Deserialize; use serde::de::{Visitor, SeqAccess, MapAccess, EnumAccess, VariantAccess, DeserializeSeed}; use std::convert::TryFrom; use std::iter::Iterator; +use std::marker::PhantomData; -pub struct Deserializer<'de, N: NestedValue> { +pub struct Deserializer<'de, N: NestedValue, D: Domain> { input: &'de N, + phantom: PhantomData, } -pub fn from_value<'a, T, N: NestedValue>(v: &'a N) -> Result where T: Deserialize<'a> { +pub fn from_value<'a, T, N: NestedValue, D: 'a + Domain>(v: &'a N) -> + Result where T: Deserialize<'a> +{ let mut de = Deserializer::from_value(v); let t = T::deserialize(&mut de)?; Ok(t) } -impl<'de, N: NestedValue> Deserializer<'de, N> { +impl<'de, N: NestedValue, D: 'de + Domain> Deserializer<'de, N, D> { pub fn from_value(v: &'de N) -> Self { - Deserializer{ input: v } + Deserializer{ input: v, phantom: PhantomData } } - fn check<'a, T, F>(&'a mut self, f: F, k: ExpectedKind) -> Result - where F: FnOnce(&'de Value) -> Option + fn check<'a, T, F>(&'a mut self, f: F, k: ExpectedKind) -> Result + where F: FnOnce(&'de Value) -> Option { f(self.input.value()).ok_or_else(|| Error::Expected(k, self.input.copy_via())) } } -impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deserializer<'de, N> { - type Error = Error; +impl<'de, 'a, N: NestedValue, D: 'de + Domain> serde::de::Deserializer<'de> + for &'a mut Deserializer<'de, N, D> +{ + type Error = Error; - fn deserialize_any(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_any(self, visitor: V) -> Result where V: Visitor<'de> { let v = self.input.value(); match v { @@ -67,70 +73,70 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali } } - fn deserialize_bool(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_bool(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_bool(self.check(|v| v.as_boolean(), ExpectedKind::Boolean)?) } - fn deserialize_i8(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_i8(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i8(i.to_i8().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_i16(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_i16(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i16(i.to_i16().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_i32(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_i32(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i32(i.to_i32().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_i64(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_i64(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i64(i.to_i64().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_u8(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_u8(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u8(i.to_u8().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_u16(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_u16(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u16(i.to_u16().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_u32(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_u32(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u32(i.to_u32().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_u64(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_u64(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u64(i.to_u64().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } - fn deserialize_f32(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_f32(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_f32(self.check(|v| v.as_float(), ExpectedKind::Float)?) } - fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_f64(self.check(|v| v.as_double(), ExpectedKind::Double)?) } - fn deserialize_char(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_char(self, visitor: V) -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record("UnicodeScalar", Some(1)), ExpectedKind::SimpleRecord("UnicodeScalar", Some(1)))?; @@ -139,27 +145,27 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali visitor.visit_char(char::try_from(c).or(Err(Error::InvalidUnicodeScalar(c)))?) } - fn deserialize_str(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_str(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_borrowed_str(&self.check(|v| v.as_string(), ExpectedKind::String)?) } - fn deserialize_string(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_string(self, visitor: V) -> Result where V: Visitor<'de> { self.deserialize_str(visitor) } - fn deserialize_bytes(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_bytes(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_borrowed_bytes(&self.check(|v| v.as_bytestring(), ExpectedKind::ByteString)?) } - fn deserialize_byte_buf(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_byte_buf(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_byte_buf(self.check(|v| v.as_bytestring(), ExpectedKind::ByteString)?.clone()) } - fn deserialize_option(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_option(self, visitor: V) -> Result where V: Visitor<'de> { match self.input.value().as_simple_record("None", Some(0)) { Some(_fs) => visitor.visit_none(), @@ -173,7 +179,7 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali } } - fn deserialize_unit(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_unit(self, visitor: V) -> Result where V: Visitor<'de> { if self.input.value().is_simple_record("tuple", Some(0)) { visitor.visit_unit() @@ -183,7 +189,7 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali } fn deserialize_unit_struct(self, name: &'static str, visitor: V) - -> Result where V: Visitor<'de> + -> Result where V: Visitor<'de> { if self.input.value().is_simple_record(name, Some(0)) { visitor.visit_unit() @@ -193,7 +199,7 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali } fn deserialize_newtype_struct(self, name: &'static str, visitor: V) - -> Result where V: Visitor<'de> + -> Result where V: Visitor<'de> { if name == crate::value::value::MAGIC { let mut buf: Vec = Vec::new(); @@ -208,12 +214,12 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali } } - fn deserialize_seq(self, visitor: V) -> Result where V: Visitor<'de> { + fn deserialize_seq(self, visitor: V) -> Result where V: Visitor<'de> { let vs = self.check(|v| v.as_sequence(), ExpectedKind::Sequence)?; visitor.visit_seq(VecSeq::new(self, vs)) } - fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record("tuple", Some(len)), ExpectedKind::SimpleRecord("tuple", Some(len)))?; @@ -221,14 +227,14 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali } fn deserialize_tuple_struct(self, name: &'static str, len: usize, visitor: V) - -> Result where V: Visitor<'de> + -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record(name, Some(len)), ExpectedKind::SimpleRecord(name, Some(len)))?; visitor.visit_seq(VecSeq::new(self, fs)) } - fn deserialize_map(self, visitor: V) -> Result where V: Visitor<'de> { + fn deserialize_map(self, visitor: V) -> Result where V: Visitor<'de> { let d = self.check(|v| v.as_dictionary(), ExpectedKind::Dictionary)?; visitor.visit_map(DictMap::new(self, d)) } @@ -237,7 +243,7 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali name: &'static str, fields: &'static [&'static str], visitor: V) - -> Result where V: Visitor<'de> + -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record(name, Some(fields.len())), ExpectedKind::SimpleRecord(name, Some(fields.len())))?; @@ -248,39 +254,39 @@ impl<'de, 'a, N: NestedValue> serde::de::Deserializer<'de> for &'a mut Deseriali _name: &'static str, _variants: &'static [&'static str], visitor: V) - -> Result where V: Visitor<'de> + -> Result where V: Visitor<'de> { visitor.visit_enum(self) } - fn deserialize_identifier(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_identifier(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_borrowed_str(&self.check(|v| v.as_symbol(), ExpectedKind::Symbol)?) } - fn deserialize_ignored_any(self, visitor: V) -> Result where V: Visitor<'de> + fn deserialize_ignored_any(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_none() } } -pub struct VecSeq<'a, 'de: 'a, N: NestedValue> { +pub struct VecSeq<'a, 'de: 'a, N: NestedValue, D: Domain> { index: usize, vec: &'de [N], - de: &'a mut Deserializer<'de, N>, + de: &'a mut Deserializer<'de, N, D>, } -impl<'de, 'a, N: NestedValue> VecSeq<'a, 'de, N> { - fn new(de: &'a mut Deserializer<'de, N>, vec: &'de [N]) -> Self { +impl<'de, 'a, N: NestedValue, D: Domain> VecSeq<'a, 'de, N, D> { + fn new(de: &'a mut Deserializer<'de, N, D>, vec: &'de [N]) -> Self { VecSeq{ index: 0, vec, de } } } -impl<'de, 'a, N: NestedValue> SeqAccess<'de> for VecSeq<'a, 'de, N> { - type Error = Error; +impl<'de, 'a, N: NestedValue, D: 'de + Domain> SeqAccess<'de> for VecSeq<'a, 'de, N, D> { + type Error = Error; fn next_element_seed(&mut self, seed: T) - -> Result> where T: DeserializeSeed<'de> + -> Result, D> where T: DeserializeSeed<'de> { if self.index == self.vec.len() { return Ok(None) @@ -293,23 +299,23 @@ impl<'de, 'a, N: NestedValue> SeqAccess<'de> for VecSeq<'a, 'de, N> { } } -pub struct DictMap<'a, 'de: 'a, N: NestedValue> { +pub struct DictMap<'a, 'de: 'a, N: NestedValue, D: Domain> { pending: Option<&'de N>, iter: Box + 'a>, - de: &'a mut Deserializer<'de, N>, + de: &'a mut Deserializer<'de, N, D>, } -impl<'de, 'a, N: NestedValue> DictMap<'a, 'de, N> { - fn new(de: &'a mut Deserializer<'de, N>, d: &'de Map) -> Self { +impl<'de, 'a, N: NestedValue, D: Domain> DictMap<'a, 'de, N, D> { + fn new(de: &'a mut Deserializer<'de, N, D>, d: &'de Map) -> Self { DictMap{ pending: None, iter: Box::new(d.iter()), de } } } -impl<'de, 'a, N: NestedValue> MapAccess<'de> for DictMap<'a, 'de, N> { - type Error = Error; +impl<'de, 'a, N: NestedValue, D: 'de + Domain> MapAccess<'de> for DictMap<'a, 'de, N, D> { + type Error = Error; fn next_key_seed(&mut self, seed: K) - -> Result> where K: DeserializeSeed<'de> + -> Result, D> where K: DeserializeSeed<'de> { match self.iter.next() { None => Ok(None), @@ -321,7 +327,7 @@ impl<'de, 'a, N: NestedValue> MapAccess<'de> for DictMap<'a, 'de, N> { } } - fn next_value_seed(&mut self, seed: V) -> Result where V: DeserializeSeed<'de> { + fn next_value_seed(&mut self, seed: V) -> Result where V: DeserializeSeed<'de> { let v = self.pending.unwrap(); self.pending = None; self.de.input = v; @@ -329,12 +335,12 @@ impl<'de, 'a, N: NestedValue> MapAccess<'de> for DictMap<'a, 'de, N> { } } -impl<'a, 'de, N: NestedValue> EnumAccess<'de> for &'a mut Deserializer<'de, N> { - type Error = Error; +impl<'a, 'de, N: NestedValue, D: 'de + Domain> EnumAccess<'de> for &'a mut Deserializer<'de, N, D> { + type Error = Error; type Variant = Self; fn variant_seed(self, seed: V) - -> Result<(V::Value, Self::Variant)> where V: DeserializeSeed<'de> + -> Result<(V::Value, Self::Variant), D> where V: DeserializeSeed<'de> { let (lp, _) = self.check(|v| v.as_record(), ExpectedKind::Record)?; let v = self.input; @@ -345,25 +351,25 @@ impl<'a, 'de, N: NestedValue> EnumAccess<'de> for &'a mut Deserializer<'de, N> { } } -impl<'a, 'de, N: NestedValue> VariantAccess<'de> for &'a mut Deserializer<'de, N> { - type Error = Error; +impl<'a, 'de, N: NestedValue, D: 'de + Domain> VariantAccess<'de> for &'a mut Deserializer<'de, N, D> { + type Error = Error; - fn unit_variant(self) -> Result<()> { + fn unit_variant(self) -> Result<(), D> { Ok(()) } - fn newtype_variant_seed(self, seed: T) -> Result where T: DeserializeSeed<'de> { + fn newtype_variant_seed(self, seed: T) -> Result where T: DeserializeSeed<'de> { let (_, fs) = self.input.value().as_record().unwrap(); self.input = &fs[0]; seed.deserialize(&mut *self) } - fn tuple_variant(self, _len: usize, visitor: V) -> Result where V: Visitor<'de> { + fn tuple_variant(self, _len: usize, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_seq(VecSeq::new(self, &self.input.value().as_record().unwrap().1)) } fn struct_variant(self, _fields: &'static [&'static str], visitor: V) - -> Result where V: Visitor<'de> + -> Result where V: Visitor<'de> { visitor.visit_seq(VecSeq::new(self, &self.input.value().as_record().unwrap().1)) } diff --git a/implementations/rust/src/value/decoder.rs b/implementations/rust/src/value/decoder.rs index 35dbc05..e76e96a 100644 --- a/implementations/rust/src/value/decoder.rs +++ b/implementations/rust/src/value/decoder.rs @@ -1,7 +1,7 @@ use std::io::{Read, ErrorKind}; use std::convert::TryInto; use std::convert::TryFrom; -use crate::value::{Value, NestedValue, Set, Map}; +use crate::value::{Value, NestedValue, Set, Map, Domain}; use num::bigint::BigInt; use crate::value::constants::{Op, InvalidOp, AtomMinor, CompoundMinor}; @@ -48,7 +48,7 @@ impl Error { pub fn is_eof(&self) -> bool { if let Error::Eof = *self { true } else { false } } } -pub type DecodePlaceholderMap = Map>; +pub type DecodePlaceholderMap = Map>; #[derive(PartialEq, Eq)] enum PeekState { @@ -57,11 +57,11 @@ enum PeekState { Full(u8), } -pub struct Decoder<'a, 'b, R: Read, N: NestedValue> { +pub struct Decoder<'a, 'b, R: Read, N: NestedValue, D: Domain> { read: &'a mut R, index: usize, buf: Box, - placeholders: Option<&'b DecodePlaceholderMap>, + placeholders: Option<&'b DecodePlaceholderMap>, read_annotations: bool, } @@ -69,8 +69,8 @@ fn decodeint(bs: &[u8]) -> BigInt { BigInt::from_signed_bytes_be(bs) } -impl<'a, 'b, R: Read, N: NestedValue> Decoder<'a, 'b, R, N> { - pub fn new(read: &'a mut R, placeholders: Option<&'b DecodePlaceholderMap>) -> Self { +impl<'a, 'b, R: Read, N: NestedValue, D: Domain> Decoder<'a, 'b, R, N, D> { + pub fn new(read: &'a mut R, placeholders: Option<&'b DecodePlaceholderMap>) -> Self { Decoder{ read, index: 0, @@ -190,7 +190,7 @@ impl<'a, 'b, R: Read, N: NestedValue> Decoder<'a, 'b, R, N> { Ok(match minor { AtomMinor::SignedInteger => Value::from(decodeint(&bs)).wrap(), AtomMinor::String => Value::from(std::str::from_utf8(&bs)?).wrap(), - AtomMinor::ByteString => Value::from(bs).wrap(), + AtomMinor::ByteString => Value::from(&bs as &[u8]).wrap(), AtomMinor::Symbol => Value::symbol(std::str::from_utf8(&bs)?).wrap(), }) } diff --git a/implementations/rust/src/value/encoder.rs b/implementations/rust/src/value/encoder.rs index a629ac0..bb12aae 100644 --- a/implementations/rust/src/value/encoder.rs +++ b/implementations/rust/src/value/encoder.rs @@ -1,5 +1,5 @@ use std::io::Write; -use crate::value::value::{Value, NestedValue, Float, Double, Map}; +use crate::value::value::{Value, NestedValue, Float, Double, Map, Domain}; use num::bigint::BigInt; use num::cast::ToPrimitive; use crate::value::constants::{Op, AtomMinor, CompoundMinor}; @@ -7,15 +7,15 @@ use crate::value::constants::{Op, AtomMinor, CompoundMinor}; pub type Error = std::io::Error; pub type Result = std::result::Result<(), Error>; -pub type EncodePlaceholderMap = Map, usize>; +pub type EncodePlaceholderMap = Map, usize>; -pub struct Encoder<'a, 'b, W: Write, N: NestedValue> { +pub struct Encoder<'a, 'b, W: Write, N: NestedValue, D: Domain> { write: &'a mut W, - placeholders: Option<&'b EncodePlaceholderMap>, + placeholders: Option<&'b EncodePlaceholderMap>, } -impl<'a, 'b, W: Write, N: NestedValue> Encoder<'a, 'b, W, N> { - pub fn new(write: &'a mut W, placeholders: Option<&'b EncodePlaceholderMap>) -> Self { +impl<'a, 'b, W: Write, N: NestedValue, D: Domain> Encoder<'a, 'b, W, N, D> { + pub fn new(write: &'a mut W, placeholders: Option<&'b EncodePlaceholderMap>) -> Self { Encoder{ write, placeholders } } @@ -78,7 +78,7 @@ impl<'a, 'b, W: Write, N: NestedValue> Encoder<'a, 'b, W, N> { self.write_value(v.value()) } - pub fn write_value(&mut self, v: &Value) -> Result { + pub fn write_value(&mut self, v: &Value) -> Result { match self.placeholders.and_then(|m| m.get(v)) { Some(&n) => self.write_header(Op::Misc(1), n), None => match v { @@ -117,6 +117,10 @@ impl<'a, 'b, W: Write, N: NestedValue> Encoder<'a, 'b, W, N> { for (k, v) in vs { self.write(k)?; self.write(v)?; } Ok(()) } + Value::Domain(ref d) => + Err(Error::new(std::io::ErrorKind::InvalidData, + format!("Cannot Preserves-encode domain-specific value {:?}", + d))), } } } diff --git a/implementations/rust/src/value/error.rs b/implementations/rust/src/value/error.rs index a88bce3..f13a67e 100644 --- a/implementations/rust/src/value/error.rs +++ b/implementations/rust/src/value/error.rs @@ -1,13 +1,13 @@ use num::bigint::BigInt; -use crate::value::PlainValue; +use crate::value::{PlainValue, Domain}; #[derive(Debug)] -pub enum Error { +pub enum Error { Message(String), InvalidUnicodeScalar(u32), NumberTooLarge(BigInt), CannotDeserializeAny, - Expected(ExpectedKind, PlainValue), + Expected(ExpectedKind, PlainValue), InternalMagicError, } @@ -29,23 +29,23 @@ pub enum ExpectedKind { Dictionary, } -pub type Result = std::result::Result; +pub type Result = std::result::Result>; -impl serde::ser::Error for Error { +impl serde::ser::Error for Error { fn custom(msg: T) -> Self { Self::Message(msg.to_string()) } } -impl serde::de::Error for Error { +impl serde::de::Error for Error { fn custom(msg: T) -> Self { Self::Message(msg.to_string()) } } -impl std::error::Error for Error {} +impl std::error::Error for Error {} -impl std::fmt::Display for Error { +impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{:?}", self) } diff --git a/implementations/rust/src/value/mod.rs b/implementations/rust/src/value/mod.rs index e04548b..cd65c31 100644 --- a/implementations/rust/src/value/mod.rs +++ b/implementations/rust/src/value/mod.rs @@ -16,6 +16,7 @@ pub use encoder::EncodePlaceholderMap; pub use encoder::Encoder; pub use ser::Serializer; pub use ser::to_value; +pub use value::Domain; pub use value::NestedValue; pub use value::Value; pub use value::AnnotatedValue; diff --git a/implementations/rust/src/value/ser.rs b/implementations/rust/src/value/ser.rs index c9853d0..d9be201 100644 --- a/implementations/rust/src/value/ser.rs +++ b/implementations/rust/src/value/ser.rs @@ -1,106 +1,109 @@ -use crate::value::{Value, NestedValue, Map}; +use crate::value::{Value, NestedValue, Map, Domain}; use serde::Serialize; use crate::value::error::{Error, Result}; use std::marker::PhantomData; -pub struct Serializer { - phantom: PhantomData +pub struct Serializer, D: Domain> { + phantom: PhantomData<(N, D)>, } -pub struct SerializeDictionary { +pub struct SerializeDictionary, D: Domain> { next_key: Option, items: Map, + phantom: PhantomData, } -pub struct SerializeRecord { +pub struct SerializeRecord, D: Domain> { name: &'static str, vec: Vec, + phantom: PhantomData, } -pub struct SerializeSequence { +pub struct SerializeSequence, D: Domain> { vec: Vec, + phantom: PhantomData, } -impl serde::Serializer for Serializer { +impl, D: Domain> serde::Serializer for Serializer { type Ok = N; - type Error = Error; - type SerializeSeq = SerializeSequence; - type SerializeTuple = SerializeRecord; - type SerializeTupleStruct = SerializeRecord; - type SerializeTupleVariant = SerializeRecord; - type SerializeMap = SerializeDictionary; - type SerializeStruct = SerializeRecord; - type SerializeStructVariant = SerializeRecord; + type Error = Error; + type SerializeSeq = SerializeSequence; + type SerializeTuple = SerializeRecord; + type SerializeTupleStruct = SerializeRecord; + type SerializeTupleVariant = SerializeRecord; + type SerializeMap = SerializeDictionary; + type SerializeStruct = SerializeRecord; + type SerializeStructVariant = SerializeRecord; - fn serialize_bool(self, v: bool) -> Result { + fn serialize_bool(self, v: bool) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_i8(self, v: i8) -> Result { + fn serialize_i8(self, v: i8) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_i16(self, v: i16) -> Result { + fn serialize_i16(self, v: i16) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_i32(self, v: i32) -> Result { + fn serialize_i32(self, v: i32) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_i64(self, v: i64) -> Result { + fn serialize_i64(self, v: i64) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_u8(self, v: u8) -> Result { + fn serialize_u8(self, v: u8) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_u16(self, v: u16) -> Result { + fn serialize_u16(self, v: u16) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_u32(self, v: u32) -> Result { + fn serialize_u32(self, v: u32) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_u64(self, v: u64) -> Result { + fn serialize_u64(self, v: u64) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_f32(self, v: f32) -> Result { + fn serialize_f32(self, v: f32) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_f64(self, v: f64) -> Result { + fn serialize_f64(self, v: f64) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_char(self, v: char) -> Result { + fn serialize_char(self, v: char) -> Result { Ok(Value::simple_record("UnicodeScalar", vec![Value::from(v as u32).wrap()]).wrap()) } - fn serialize_str(self, v: &str) -> Result { + fn serialize_str(self, v: &str) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_bytes(self, v: &[u8]) -> Result { + fn serialize_bytes(self, v: &[u8]) -> Result { Ok(Value::from(v).wrap()) } - fn serialize_none(self) -> Result { + fn serialize_none(self) -> Result { Ok(Value::simple_record("None", vec![]).wrap()) } - fn serialize_some(self, v: &T) -> Result where T: Serialize { + fn serialize_some(self, v: &T) -> Result where T: Serialize { Ok(Value::simple_record("Some", vec![to_value(v)?]).wrap()) } - fn serialize_unit(self) -> Result { + fn serialize_unit(self) -> Result { Ok(Value::simple_record("tuple", vec![]).wrap()) } - fn serialize_unit_struct(self, name: &'static str) -> Result { + fn serialize_unit_struct(self, name: &'static str) -> Result { Ok(Value::simple_record(name, vec![]).wrap()) } @@ -108,16 +111,16 @@ impl serde::Serializer for Serializer { _name: &'static str, _variant: u32, variant_name: &'static str) -> - Result + Result { Ok(Value::simple_record(variant_name, vec![]).wrap()) } fn serialize_newtype_struct(self, name: &'static str, value: &T) -> - Result where T: Serialize + Result where T: Serialize { if name == crate::value::value::MAGIC { - let v: crate::value::PlainValue = to_value(value)?; + let v: crate::value::PlainValue = to_value(value)?; let mut buf: &[u8] = v.value().as_bytestring().ok_or(Error::InternalMagicError)?; crate::value::Decoder::new(&mut buf, None).next().or(Err(Error::InternalMagicError)) } else { @@ -131,24 +134,24 @@ impl serde::Serializer for Serializer { _variant: u32, variant_name: &'static str, value: &T) -> - Result where T: Serialize + Result where T: Serialize { Ok(Value::simple_record(variant_name, vec![to_value(value)?]).wrap()) } - fn serialize_seq(self, count: Option) -> Result { + fn serialize_seq(self, count: Option) -> Result { let vec = match count { Some(n) => Vec::with_capacity(n), None => Vec::new() }; - Ok(SerializeSequence{ vec }) + Ok(SerializeSequence{ vec, phantom: PhantomData }) } - fn serialize_tuple(self, count: usize) -> Result { - Ok(SerializeRecord{ name: "tuple", vec: Vec::with_capacity(count) }) + fn serialize_tuple(self, count: usize) -> Result { + Ok(SerializeRecord{ name: "tuple", vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_tuple_struct(self, name: &'static str, count: usize) -> - Result + Result { - Ok(SerializeRecord{ name, vec: Vec::with_capacity(count) }) + Ok(SerializeRecord{ name, vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_tuple_variant(self, @@ -156,17 +159,17 @@ impl serde::Serializer for Serializer { _variant: u32, variant_name: &'static str, count: usize) -> - Result + Result { - Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count) }) + Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count), phantom: PhantomData }) } - fn serialize_map(self, _count: Option) -> Result { - Ok(SerializeDictionary{ next_key: None, items: Map::new() }) + fn serialize_map(self, _count: Option) -> Result { + Ok(SerializeDictionary{ next_key: None, items: Map::new(), phantom: PhantomData }) } - fn serialize_struct(self, name: &'static str, count: usize) -> Result { - Ok(SerializeRecord{ name, vec: Vec::with_capacity(count) }) + fn serialize_struct(self, name: &'static str, count: usize) -> Result { + Ok(SerializeRecord{ name, vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_struct_variant(self, @@ -174,126 +177,126 @@ impl serde::Serializer for Serializer { _variant: u32, variant_name: &'static str, count: usize) -> - Result + Result { - Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count) }) + Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count), phantom: PhantomData }) } } -impl serde::ser::SerializeMap for SerializeDictionary { +impl, D: Domain> serde::ser::SerializeMap for SerializeDictionary { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_key(&mut self, key: &T) -> Result<()> where T: Serialize { + fn serialize_key(&mut self, key: &T) -> Result<(), D> where T: Serialize { self.next_key = Some(to_value(key)?); Ok(()) } - fn serialize_value(&mut self, value: &T) -> Result<()> where T: Serialize { + fn serialize_value(&mut self, value: &T) -> Result<(), D> where T: Serialize { let key = self.next_key.take().unwrap(); self.items.insert(key, to_value(value)?); Ok(()) } - fn end(self) -> Result { + fn end(self) -> Result { Ok(Value::from(self.items).wrap()) } } -impl SerializeRecord { - fn push(&mut self, value: N) -> Result<()> { +impl, D: Domain> SerializeRecord { + fn push(&mut self, value: N) -> Result<(), D> { self.vec.push(value); Ok(()) } - fn finish(self) -> Result { + fn finish(self) -> Result { Ok(Value::simple_record(self.name, self.vec).wrap()) } } -impl serde::ser::SerializeStruct for SerializeRecord { +impl, D: Domain> serde::ser::SerializeStruct for SerializeRecord { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_field(&mut self, _name: &'static str, value: &T) -> Result<()> + fn serialize_field(&mut self, _name: &'static str, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } - fn end(self) -> Result { + fn end(self) -> Result { self.finish() } } -impl serde::ser::SerializeStructVariant for SerializeRecord { +impl, D: Domain> serde::ser::SerializeStructVariant for SerializeRecord { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_field(&mut self, _name: &'static str, value: &T) -> Result<()> + fn serialize_field(&mut self, _name: &'static str, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } - fn end(self) -> Result { + fn end(self) -> Result { self.finish() } } -impl serde::ser::SerializeTuple for SerializeRecord { +impl, D: Domain> serde::ser::SerializeTuple for SerializeRecord { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_element(&mut self, value: &T) -> Result<()> where T: Serialize { + fn serialize_element(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } - fn end(self) -> Result { + fn end(self) -> Result { self.finish() } } -impl serde::ser::SerializeTupleStruct for SerializeRecord { +impl, D: Domain> serde::ser::SerializeTupleStruct for SerializeRecord { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_field(&mut self, value: &T) -> Result<()> where T: Serialize { + fn serialize_field(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } - fn end(self) -> Result { + fn end(self) -> Result { self.finish() } } -impl serde::ser::SerializeTupleVariant for SerializeRecord { +impl, D: Domain> serde::ser::SerializeTupleVariant for SerializeRecord { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_field(&mut self, value: &T) -> Result<()> where T: Serialize { + fn serialize_field(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } - fn end(self) -> Result { + fn end(self) -> Result { self.finish() } } -impl serde::ser::SerializeSeq for SerializeSequence { +impl, D: Domain> serde::ser::SerializeSeq for SerializeSequence { type Ok = N; - type Error = Error; + type Error = Error; - fn serialize_element(&mut self, value: &T) -> Result<()> where T: Serialize { + fn serialize_element(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.vec.push(to_value(value)?); Ok(()) } - fn end(self) -> Result { + fn end(self) -> Result { Ok(Value::from(self.vec).wrap()) } } -pub fn to_value(value: T) -> Result where T: Serialize, N: NestedValue { +pub fn to_value(value: T) -> Result where T: Serialize, N: NestedValue { value.serialize(Serializer{ phantom: PhantomData }) } diff --git a/implementations/rust/src/value/value.rs b/implementations/rust/src/value/value.rs index 78755bd..d100c4c 100644 --- a/implementations/rust/src/value/value.rs +++ b/implementations/rust/src/value/value.rs @@ -11,18 +11,20 @@ use num::traits::cast::ToPrimitive; pub use std::collections::BTreeSet as Set; pub use std::collections::BTreeMap as Map; -pub trait NestedValue: Sized + Debug + Clone + Eq + Hash + Ord { +pub trait Domain: Sized + Debug + Clone + Eq + Hash + Ord {} + +pub trait NestedValue: Sized + Debug + Clone + Eq + Hash + Ord { type BoxType: Sized + Debug + Clone + Eq + Hash + Ord; - fn wrap(v: Value) -> Self; - fn wrap_ann(anns: Vec, v: Value) -> Self; + fn wrap(v: Value) -> Self; + fn wrap_ann(anns: Vec, v: Value) -> Self; fn boxwrap(self) -> Self::BoxType; fn boxunwrap(b: &Self::BoxType) -> &Self; fn annotations(&self) -> &[Self]; - fn value(&self) -> &Value; - fn value_owned(self) -> Value; + fn value(&self) -> &Value; + fn value_owned(self) -> Value; fn debug_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { for ann in self.annotations() { @@ -31,7 +33,7 @@ pub trait NestedValue: Sized + Debug + Clone + Eq + Hash + Ord { self.value().fmt(f) } - fn copy_via(&self) -> M { + fn copy_via>(&self) -> M { M::wrap_ann(self.annotations().iter().map(|a| a.copy_via()).collect(), self.value().copy_via()) } @@ -39,7 +41,7 @@ pub trait NestedValue: Sized + Debug + Clone + Eq + Hash + Ord { /// The `Value`s from the specification. #[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub enum Value where N: NestedValue { +pub enum Value where N: NestedValue, D: Domain { Boolean(bool), Float(Float), Double(Double), @@ -47,10 +49,11 @@ pub enum Value where N: NestedValue { String(String), ByteString(Vec), Symbol(String), - Record(Record), + Record(Record), Sequence(Vec), Set(Set), Dictionary(Map), + Domain(D), } /// Single-precision IEEE 754 Value @@ -62,7 +65,7 @@ pub struct Float(pub f32); pub struct Double(pub f64); /// A Record `Value` -pub type Record = (::BoxType, Vec); +pub type Record = (>::BoxType, Vec); impl From for Float { fn from(v: f32) -> Self { @@ -148,34 +151,34 @@ impl PartialOrd for Double { impl Eq for Double {} -impl From for Value { fn from(v: bool) -> Self { Value::Boolean(v) } } +impl, D: Domain> From for Value { fn from(v: bool) -> Self { Value::Boolean(v) } } -impl From for Value { fn from(v: f32) -> Self { Value::Float(Float::from(v)) } } -impl From for Value { fn from(v: f64) -> Self { Value::Double(Double::from(v)) } } +impl, D: Domain> From for Value { fn from(v: f32) -> Self { Value::Float(Float::from(v)) } } +impl, D: Domain> From for Value { fn from(v: f64) -> Self { Value::Double(Double::from(v)) } } -impl From for Value { fn from(v: u8) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: i8) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: u16) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: i16) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: u32) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: i32) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: u64) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: i64) -> Self { Value::from(i128::from(v)) } } -impl From for Value { fn from(v: u128) -> Self { Value::SignedInteger(BigInt::from(v)) } } -impl From for Value { fn from(v: i128) -> Self { Value::SignedInteger(BigInt::from(v)) } } -impl From for Value { fn from(v: BigInt) -> Self { Value::SignedInteger(v) } } +impl, D: Domain> From for Value { fn from(v: u8) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: i8) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: u16) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: i16) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: u32) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: i32) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: u64) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: i64) -> Self { Value::from(i128::from(v)) } } +impl, D: Domain> From for Value { fn from(v: u128) -> Self { Value::SignedInteger(BigInt::from(v)) } } +impl, D: Domain> From for Value { fn from(v: i128) -> Self { Value::SignedInteger(BigInt::from(v)) } } +impl, D: Domain> From for Value { fn from(v: BigInt) -> Self { Value::SignedInteger(v) } } -impl From<&str> for Value { fn from(v: &str) -> Self { Value::String(String::from(v)) } } -impl From for Value { fn from(v: String) -> Self { Value::String(v) } } +impl, D: Domain> From<&str> for Value { fn from(v: &str) -> Self { Value::String(String::from(v)) } } +impl, D: Domain> From for Value { fn from(v: String) -> Self { Value::String(v) } } -impl From<&[u8]> for Value { fn from(v: &[u8]) -> Self { Value::ByteString(Vec::from(v)) } } -impl From> for Value { fn from(v: Vec) -> Self { Value::ByteString(v) } } +impl, D: Domain> From<&[u8]> for Value { fn from(v: &[u8]) -> Self { Value::ByteString(Vec::from(v)) } } +// impl, D: Domain> From> for Value { fn from(v: Vec) -> Self { Value::ByteString(v) } } -impl From> for Value { fn from(v: Vec) -> Self { Value::Sequence(v) } } -impl From> for Value { fn from(v: Set) -> Self { Value::Set(v) } } -impl From> for Value { fn from(v: Map) -> Self { Value::Dictionary(v) } } +impl, D: Domain> From> for Value { fn from(v: Vec) -> Self { Value::Sequence(v) } } +impl, D: Domain> From> for Value { fn from(v: Set) -> Self { Value::Set(v) } } +impl, D: Domain> From> for Value { fn from(v: Map) -> Self { Value::Dictionary(v) } } -impl Debug for Value { +impl, D: Domain> Debug for Value { // Not *quite* a formatter for the Preserves text syntax, since it // doesn't escape strings/symbols properly. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -213,14 +216,15 @@ impl Debug for Value { f.write_str("#set")?; f.debug_set().entries(v.iter()).finish() } - Value::Dictionary(ref v) => f.debug_map().entries(v.iter()).finish() + Value::Dictionary(ref v) => f.debug_map().entries(v.iter()).finish(), + Value::Domain(ref d) => write!(f, "{:?}", d), } } } //--------------------------------------------------------------------------- -impl Value { +impl, D: Domain> Value { pub fn wrap(self) -> N { N::wrap(self) } @@ -354,7 +358,7 @@ impl Value { } } - pub fn symbol(s: &str) -> Value { + pub fn symbol(s: &str) -> Value { Value::Symbol(s.to_string()) } @@ -378,7 +382,7 @@ impl Value { } } - pub fn record(label: N, fields: Vec) -> Value { + pub fn record(label: N, fields: Vec) -> Value { Value::Record((label.boxwrap(), fields)) } @@ -386,7 +390,7 @@ impl Value { self.as_record().is_some() } - pub fn as_record(&self) -> Option<&Record> { + pub fn as_record(&self) -> Option<&Record> { if let Value::Record(ref r) = *self { Some(r) } else { @@ -394,7 +398,7 @@ impl Value { } } - pub fn as_record_mut(&mut self) -> Option<&mut Record> { + pub fn as_record_mut(&mut self) -> Option<&mut Record> { if let Value::Record(ref mut r) = *self { Some(r) } else { @@ -402,7 +406,7 @@ impl Value { } } - pub fn simple_record(label: &str, fields: Vec) -> Value { + pub fn simple_record(label: &str, fields: Vec) -> Value { Value::record(Value::symbol(label).wrap(), fields) } @@ -484,7 +488,7 @@ impl Value { } } - pub fn copy_via(&self) -> Value { + pub fn copy_via>(&self) -> Value { match self { Value::Boolean(b) => Value::Boolean(*b), Value::Float(f) => Value::Float(f.clone()), @@ -499,11 +503,12 @@ impl Value { Value::Set(ref v) => Value::Set(v.iter().map(|a| a.copy_via()).collect()), Value::Dictionary(ref v) => Value::Dictionary(v.iter().map(|(a,b)| (a.copy_via(), b.copy_via())).collect()), + Value::Domain(d) => Value::Domain(d.clone()), } } } -impl Index for Value { +impl, D: Domain> Index for Value { type Output = N; fn index(&self, i: usize) -> &Self::Output { @@ -511,13 +516,13 @@ impl Index for Value { } } -impl IndexMut for Value { +impl, D: Domain> IndexMut for Value { fn index_mut(&mut self, i: usize) -> &mut Self::Output { &mut self.as_sequence_mut().unwrap()[i] } } -impl Index<&N> for Value { +impl, D: Domain> Index<&N> for Value { type Output = N; fn index(&self, i: &N) -> &Self::Output { @@ -554,7 +559,7 @@ impl<'de> serde::Deserialize<'de> for ValueWrapper { } } -impl serde::Serialize for Value { +impl, D: Domain> serde::Serialize for Value { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { let mut buf: Vec = Vec::new(); crate::value::Encoder::new(&mut buf, None).write_value(self) @@ -563,7 +568,7 @@ impl serde::Serialize for Value { } } -impl<'de, N: NestedValue> serde::Deserialize<'de> for Value { +impl<'de, N: NestedValue, Dom: Domain> serde::Deserialize<'de> for Value { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { let ValueWrapper(buf) = ValueWrapper::deserialize(deserializer)?; let v: N = crate::value::Decoder::new(&mut &buf[..], None).next() @@ -572,8 +577,8 @@ impl<'de, N: NestedValue> serde::Deserialize<'de> for Value { } } -pub fn serialize_nested_value(v: &N, serializer: S) -> - Result where S: serde::Serializer, N: NestedValue +pub fn serialize_nested_value(v: &N, serializer: S) -> + Result where S: serde::Serializer, N: NestedValue { use serde::Serialize; let mut buf: Vec = Vec::new(); @@ -582,8 +587,8 @@ pub fn serialize_nested_value(v: &N, serializer: S) -> ValueWrapper(buf).serialize(serializer) } -pub fn deserialize_nested_value<'de, D, N>(deserializer: D) -> - Result where D: serde::Deserializer<'de>, N: NestedValue +pub fn deserialize_nested_value<'de, D, N, Dom: Domain>(deserializer: D) -> + Result where D: serde::Deserializer<'de>, N: NestedValue { use serde::Deserialize; let ValueWrapper(buf) = ValueWrapper::deserialize(deserializer)?; @@ -596,29 +601,29 @@ pub fn deserialize_nested_value<'de, D, N>(deserializer: D) -> /// An possibly-annotated Value, with annotations (themselves /// possibly-annotated) in order of appearance. #[derive(Clone)] -pub struct AnnotatedValue(pub Vec, pub Value); +pub struct AnnotatedValue, D: Domain>(pub Vec, pub Value); -impl PartialEq for AnnotatedValue { +impl, D: Domain> PartialEq for AnnotatedValue { fn eq(&self, other: &Self) -> bool { self.1.eq(&other.1) } } -impl Eq for AnnotatedValue {} +impl, D: Domain> Eq for AnnotatedValue {} -impl Hash for AnnotatedValue { +impl, D: Domain> Hash for AnnotatedValue { fn hash(&self, state: &mut H) { self.1.hash(state); } } -impl PartialOrd for AnnotatedValue { +impl, D: Domain> PartialOrd for AnnotatedValue { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl Ord for AnnotatedValue { +impl, D: Domain> Ord for AnnotatedValue { fn cmp(&self, other: &Self) -> Ordering { self.1.cmp(&other.1) } @@ -627,26 +632,26 @@ impl Ord for AnnotatedValue { //--------------------------------------------------------------------------- #[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct PlainValue(AnnotatedValue); +pub struct PlainValue(AnnotatedValue, D>); -impl PlainValue { +impl PlainValue { pub fn annotations_mut(&mut self) -> &mut Vec { &mut (self.0).0 } - pub fn value_mut(&mut self) -> &mut Value { + pub fn value_mut(&mut self) -> &mut Value { &mut (self.0).1 } } -impl NestedValue for PlainValue { +impl NestedValue for PlainValue { type BoxType = Box; - fn wrap(v: Value) -> Self { + fn wrap(v: Value) -> Self { Self::wrap_ann(Vec::new(), v) } - fn wrap_ann(anns: Vec, v: Value) -> Self { + fn wrap_ann(anns: Vec, v: Value) -> Self { PlainValue(AnnotatedValue(anns, v)) } @@ -662,28 +667,28 @@ impl NestedValue for PlainValue { &(self.0).0 } - fn value(&self) -> &Value { + fn value(&self) -> &Value { &(self.0).1 } - fn value_owned(self) -> Value { + fn value_owned(self) -> Value { (self.0).1 } } -impl Debug for PlainValue { +impl Debug for PlainValue { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.debug_fmt(f) } } -impl serde::Serialize for PlainValue { +impl serde::Serialize for PlainValue { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { serialize_nested_value(self, serializer) } } -impl<'de> serde::Deserialize<'de> for PlainValue { +impl<'de, Dom: Domain> serde::Deserialize<'de> for PlainValue { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { deserialize_nested_value(deserializer) } @@ -694,16 +699,16 @@ impl<'de> serde::Deserialize<'de> for PlainValue { use std::rc::Rc; #[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct RcValue(Rc>); +pub struct RcValue(Rc, D>>); -impl NestedValue for RcValue { +impl NestedValue for RcValue { type BoxType = Self; - fn wrap(v: Value) -> Self { + fn wrap(v: Value) -> Self { Self::wrap_ann(Vec::new(), v) } - fn wrap_ann(anns: Vec, v: Value) -> Self { + fn wrap_ann(anns: Vec, v: Value) -> Self { RcValue(Rc::new(AnnotatedValue(anns, v))) } @@ -719,28 +724,28 @@ impl NestedValue for RcValue { &(self.0).0 } - fn value(&self) -> &Value { + fn value(&self) -> &Value { &(self.0).1 } - fn value_owned(self) -> Value { + fn value_owned(self) -> Value { Rc::try_unwrap(self.0).unwrap_or_else(|_| panic!("value_owned on RcValue with refcount greater than one")).1 } } -impl Debug for RcValue { +impl Debug for RcValue { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.debug_fmt(f) } } -impl serde::Serialize for RcValue { +impl serde::Serialize for RcValue { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { serialize_nested_value(self, serializer) } } -impl<'de> serde::Deserialize<'de> for RcValue { +impl<'de, Dom: Domain> serde::Deserialize<'de> for RcValue { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { deserialize_nested_value(deserializer) } @@ -751,16 +756,16 @@ impl<'de> serde::Deserialize<'de> for RcValue { use std::sync::Arc; #[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct ArcValue(Arc>); +pub struct ArcValue(Arc, D>>); -impl NestedValue for ArcValue { +impl NestedValue for ArcValue { type BoxType = Self; - fn wrap(v: Value) -> Self { + fn wrap(v: Value) -> Self { Self::wrap_ann(Vec::new(), v) } - fn wrap_ann(anns: Vec, v: Value) -> Self { + fn wrap_ann(anns: Vec, v: Value) -> Self { ArcValue(Arc::new(AnnotatedValue(anns, v))) } @@ -776,29 +781,33 @@ impl NestedValue for ArcValue { &(self.0).0 } - fn value(&self) -> &Value { + fn value(&self) -> &Value { &(self.0).1 } - fn value_owned(self) -> Value { + fn value_owned(self) -> Value { Arc::try_unwrap(self.0).unwrap_or_else(|_| panic!("value_owned on ArcValue with refcount greater than one")).1 } } -impl Debug for ArcValue { +impl Debug for ArcValue { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.debug_fmt(f) } } -impl serde::Serialize for ArcValue { +impl serde::Serialize for ArcValue { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { serialize_nested_value(self, serializer) } } -impl<'de> serde::Deserialize<'de> for ArcValue { +impl<'de, Dom: Domain> serde::Deserialize<'de> for ArcValue { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { deserialize_nested_value(deserializer) } } + +//--------------------------------------------------------------------------- + +impl Domain for () {}