2019-10-12 14:40:35 +00:00
|
|
|
use crate::value::{decoder, encoder, invert_map, NestedValue};
|
2019-09-17 10:27:44 +00:00
|
|
|
use decoder::{Decoder, DecodePlaceholderMap};
|
|
|
|
use encoder::{Encoder, EncodePlaceholderMap};
|
|
|
|
use std::io::{Read, Write};
|
|
|
|
|
|
|
|
pub type Error = decoder::Error;
|
|
|
|
pub type Result<T> = decoder::Result<T>;
|
|
|
|
|
2019-10-12 14:40:35 +00:00
|
|
|
pub struct Codec<N: NestedValue> {
|
|
|
|
pub decode_placeholders: Option<DecodePlaceholderMap<N>>,
|
|
|
|
pub encode_placeholders: Option<EncodePlaceholderMap<N>>,
|
2019-09-17 10:27:44 +00:00
|
|
|
}
|
|
|
|
|
2019-10-12 14:40:35 +00:00
|
|
|
impl<N: NestedValue> Codec<N> {
|
|
|
|
pub fn new(decode_placeholders: DecodePlaceholderMap<N>) -> Self {
|
2019-09-17 10:27:44 +00:00
|
|
|
let encode_placeholders = Some(invert_map(&decode_placeholders));
|
|
|
|
Codec { decode_placeholders: Some(decode_placeholders), encode_placeholders }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn without_placeholders() -> Self {
|
|
|
|
Codec { decode_placeholders: None, encode_placeholders: None }
|
|
|
|
}
|
|
|
|
|
2019-10-12 14:40:35 +00:00
|
|
|
pub fn decoder<'a, 'r, R: Read>(&'a self, read: &'r mut R) -> Decoder<'r, 'a, R, N> {
|
2019-09-17 10:27:44 +00:00
|
|
|
Decoder::new(read, self.decode_placeholders.as_ref())
|
|
|
|
}
|
|
|
|
|
2019-10-12 14:40:35 +00:00
|
|
|
pub fn encoder<'a, 'w, W: Write>(&'a self, write: &'w mut W) -> Encoder<'w, 'a, W, N> {
|
2019-09-17 10:27:44 +00:00
|
|
|
Encoder::new(write, self.encode_placeholders.as_ref())
|
|
|
|
}
|
|
|
|
|
2019-10-12 14:40:35 +00:00
|
|
|
pub fn decode<'r, R: Read>(&self, read: &'r mut R) -> Result<N> {
|
2019-09-17 10:27:44 +00:00
|
|
|
self.decoder(read).next()
|
|
|
|
}
|
|
|
|
|
2019-10-12 14:40:35 +00:00
|
|
|
pub fn encode_bytes(&self, v: &N) -> Result<Vec<u8>> {
|
2019-09-17 10:27:44 +00:00
|
|
|
let mut buf: Vec<u8> = Vec::new();
|
|
|
|
self.encoder(&mut buf).write(v)?;
|
|
|
|
Ok(buf)
|
|
|
|
}
|
|
|
|
}
|