preserves/implementations/rust/src/value/encoder.rs

63 lines
2.5 KiB
Rust
Raw Normal View History

2020-05-23 20:33:02 +00:00
use super::value::{Value, NestedValue, Float, Double, Map, Domain};
use super::writer::Writer;
2019-09-15 15:16:17 +00:00
2020-05-25 13:40:01 +00:00
pub use super::writer::Result;
2019-09-15 15:16:17 +00:00
pub type EncodePlaceholderMap<N, D> = Map<Value<N, D>, usize>;
2019-09-15 15:16:17 +00:00
2020-05-23 20:33:02 +00:00
pub struct Encoder<'a, 'b, W: Writer, N: NestedValue<D>, D: Domain> {
pub write: &'a mut W,
pub placeholders: Option<&'b EncodePlaceholderMap<N, D>>,
2019-09-15 15:16:17 +00:00
}
2020-05-23 20:33:02 +00:00
impl<'a, 'b, W: Writer, N: NestedValue<D>, D: Domain> Encoder<'a, 'b, W, N, D> {
pub fn new(write: &'a mut W, placeholders: Option<&'b EncodePlaceholderMap<N, D>>) -> Self {
Encoder{ write, placeholders }
2019-09-15 15:16:17 +00:00
}
pub fn write(&mut self, v: &N) -> Result {
2019-09-15 15:16:17 +00:00
for ann in v.annotations() {
2020-05-23 20:33:02 +00:00
self.write.write_annotation_prefix()?;
2019-09-15 15:16:17 +00:00
self.write(ann)?;
}
2019-09-16 23:58:32 +00:00
self.write_value(v.value())
}
pub fn write_value(&mut self, v: &Value<N, D>) -> Result {
match self.placeholders.and_then(|m| m.get(v)) {
2020-05-23 20:33:02 +00:00
Some(&n) => self.write.write_placeholder_ref(n),
2019-09-16 23:58:32 +00:00
None => match v {
2020-05-23 20:33:02 +00:00
Value::Boolean(b) => self.write.write_bool(*b),
Value::Float(Float(f)) => self.write.write_f32(*f),
Value::Double(Double(d)) => self.write.write_f64(*d),
Value::SignedInteger(ref b) => self.write.write_int(b),
Value::String(ref s) => self.write.write_string(s),
Value::ByteString(ref bs) => self.write.write_bytes(bs),
Value::Symbol(ref s) => self.write.write_symbol(s),
2019-09-15 15:16:17 +00:00
Value::Record((ref l, ref fs)) => {
2020-05-23 20:33:02 +00:00
self.write.open_record(fs.len())?;
self.write(N::boxunwrap(l))?;
2019-10-20 12:57:04 +00:00
for f in fs { self.write(f)?; }
2020-05-23 20:33:02 +00:00
self.write.close_record()
2019-09-15 15:16:17 +00:00
}
Value::Sequence(ref vs) => {
2020-05-23 20:33:02 +00:00
self.write.open_sequence(vs.len())?;
2019-10-20 12:57:04 +00:00
for v in vs { self.write(v)?; }
2020-05-23 20:33:02 +00:00
self.write.close_sequence()
2019-09-15 15:16:17 +00:00
}
Value::Set(ref vs) => {
2020-05-23 20:33:02 +00:00
self.write.open_set(vs.len())?;
2019-10-20 12:57:04 +00:00
for v in vs { self.write(v)?; }
2020-05-23 20:33:02 +00:00
self.write.close_set()
2019-09-15 15:16:17 +00:00
}
Value::Dictionary(ref vs) => {
2020-05-23 20:33:02 +00:00
self.write.open_dictionary(vs.len())?;
2019-10-20 12:57:04 +00:00
for (k, v) in vs { self.write(k)?; self.write(v)?; }
2020-05-23 20:33:02 +00:00
self.write.close_dictionary()
2019-09-15 15:16:17 +00:00
}
Value::Domain(ref d) => d.encode(self),
2019-09-15 15:16:17 +00:00
}
}
}
}