use parser::Handler;
use value::{Map, Value};
#[derive(Debug, Default)]
pub struct Decoder {
messages: Vec<Map>,
}
impl Decoder {
pub fn new() -> Self {
Self { messages: vec![Map::new()] }
}
fn current_message(&mut self) -> &mut Map {
self.messages
.last_mut()
.expect("non-empty messages stack")
}
}
impl Handler for Decoder {
type T = Value;
fn uint64(&mut self, id: u64, value: u64) {
self.current_message().insert(id, Value::UInt(value));
}
fn binary(&mut self, id: u64, value: &[u8]) {
self.current_message()
.insert(id, Value::Data(Vec::from(value)));
}
fn begin_nested(&mut self) {
self.messages.push(Map::new());
}
fn end_nested(&mut self, id: u64) {
let nested_message = self.messages.pop().expect("non-empty messages stack");
self.current_message()
.insert(id, Value::Message(nested_message));
}
fn finish(mut self) -> Value {
let result = self.messages.pop().expect("non-empty messages stack");
if !self.messages.is_empty() {
panic!("messages remaining in stack");
}
Value::Message(result)
}
}