serde_bencode 0.1.0

A Serde backed Bencode encoding/decoding library for Rust.
Documentation
use std::str;
use serde::ser::{Serializer, Serialize, Error};
use error::BencodeError;

type Token = Vec<u8>;
type Context = Vec<Token>;

#[derive(Debug)]
pub struct Encoder {
    stack: Vec<Context>
}

impl Encoder {
    pub fn new() -> Encoder {
        let mut stack = Vec::new();
        stack.push(Context::new());
        Encoder {
            stack: stack
        }
    }

    pub fn encoded(&self) -> Vec<u8> {
        let mut result: Vec<u8> = Vec::new();
        for c in self.stack.iter() {
            for t in c.iter() {
                result.extend_from_slice(&t)
            }
        }
        result
    }

    fn push(&mut self, token: &[u8]) {
        if let Some(last) = self.stack.last_mut() {
            (*last).push(token.into());
        }
    }

    fn new_context(&mut self) {
        self.stack.push(Context::new());
    }

    fn merge_context(&mut self) {
        if let Some(current) = self.stack.pop() {
            if let Some(last) = self.stack.last_mut() {
                (*last).extend(current);
            }
        }
    }

    fn tokenify_context(&mut self) {
        if let Some(c) = self.stack.pop() {
            let token: Token = c.into_iter().flat_map(|t| t).collect();
            self.push(&token);
        }
    }

    fn sort_current_context(&mut self) {
        if let Some(last) = self.stack.pop() {
            let mut m: Vec<_> = last.chunks(2).collect();
            m.sort();
            self.new_context();
            for c in m.iter() {
                self.push(&c[0]);
                self.push(&c[1]);
            }
        }
    }

    fn start_dict(&mut self) {
        self.new_context();
        self.push(&"d".as_bytes());
        self.new_context();
    }

    fn end_dict(&mut self) {
        self.sort_current_context();
        self.merge_context();
        self.push("e".as_bytes());
        self.tokenify_context();
    }
}

impl<'a> From<&'a Encoder> for Vec<u8> {
    fn from(encoder: &Encoder) -> Vec<u8> {
        encoder.encoded()
    }
}

impl From<Encoder> for Vec<u8> {
    fn from(encoder: Encoder) -> Vec<u8> {
        encoder.encoded()
    }
}

impl Serializer for Encoder {

    type Error = BencodeError;
    type SeqState = ();
    type TupleState = ();
    type TupleStructState = ();
    type TupleVariantState = ();
    type MapState = ();
    type StructState = ();
    type StructVariantState = ();

    fn serialize_bool(&mut self, value: bool) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_isize(&mut self, value: isize) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_i8(&mut self, value: i8) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_i16(&mut self, value: i16) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_i32(&mut self, value: i32) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_i64(&mut self, value: i64) -> Result<(), Self::Error> {
        let mut token = Vec::new();
        token.extend_from_slice(&"i".as_bytes());
        token.extend_from_slice(&value.to_string().as_bytes());
        token.extend_from_slice(&"e".as_bytes());
        self.push(&token);
        Ok(())
    }
    fn serialize_usize(&mut self, value: usize) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_u8(&mut self, value: u8) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_u16(&mut self, value: u16) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_u32(&mut self, value: u32) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_u64(&mut self, value: u64) -> Result<(), Self::Error> {
        self.serialize_i64(value as i64)
    }
    fn serialize_f32(&mut self, _value: f32) -> Result<(), Self::Error> {
        Err(BencodeError::invalid_value("Cannot serialize f32"))
    }
    fn serialize_f64(&mut self, _value: f64) -> Result<(), Self::Error> {
        Err(BencodeError::invalid_value("Cannot serialize f64"))
    }
    fn serialize_char(&mut self, value: char) -> Result<(), Self::Error> {
        self.serialize_bytes(&[value as u8])
    }
    fn serialize_str(&mut self, value: &str) -> Result<(), Self::Error> {
        self.serialize_bytes(value.as_bytes())
    }
    fn serialize_bytes(&mut self, value: &[u8]) -> Result<(), Self::Error> {
        let mut token = Vec::new();
        token.extend_from_slice(&value.len().to_string().as_bytes());
        token.extend_from_slice(&":".as_bytes());
        token.extend_from_slice(value);
        self.push(&token);
        Ok(())
    }
    fn serialize_unit(&mut self) -> Result<(), Self::Error> {
        Ok(())
    }
    fn serialize_unit_struct(&mut self, _name: &'static str) -> Result<(), Self::Error> {
        self.serialize_unit()
    }
    fn serialize_unit_variant(&mut self, _name: &'static str, _variant_index: usize, _variant: &'static str) -> Result<(), Self::Error> {
        self.serialize_unit()
    }
    fn serialize_newtype_struct<T: Serialize>(&mut self, _name: &'static str, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_newtype_variant<T: Serialize>(&mut self, _name: &'static str, _variant_index: usize, _variant: &'static str, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_none(&mut self) -> Result<(), Self::Error> {
        Ok(())
    }
    fn serialize_some<T: Serialize>(&mut self, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_seq(&mut self, _len: Option<usize>) -> Result<Self::SeqState, Self::Error> {
        self.new_context();
        self.push("l".as_bytes());
        Ok(())
    }
    fn serialize_seq_elt<T: Serialize>(&mut self, _state: &mut Self::SeqState, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_seq_end(&mut self, _state: Self::SeqState) -> Result<(), Self::Error> {
        self.push("e".as_bytes());
        self.tokenify_context();
        Ok(())
    }
    fn serialize_seq_fixed_size(&mut self, size: usize) -> Result<Self::SeqState, Self::Error> {
        self.serialize_seq(Some(size))
    }
    fn serialize_tuple(&mut self, size: usize) -> Result<Self::TupleState, Self::Error> {
        self.serialize_seq(Some(size))
    }
    fn serialize_tuple_elt<T: Serialize>(&mut self, _state: &mut Self::TupleState, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_tuple_end(&mut self, _state: Self::TupleState) -> Result<(), Self::Error> {
        self.serialize_seq_end(())
    }
    fn serialize_tuple_struct(&mut self, _name: &'static str, len: usize) -> Result<Self::TupleStructState, Self::Error> {
        self.serialize_tuple(len)
    }
    fn serialize_tuple_struct_elt<T: Serialize>(&mut self, _state: &mut Self::TupleStructState, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_tuple_struct_end(&mut self, _state: Self::TupleStructState) -> Result<(), Self::Error> {
        self.serialize_tuple_end(())
    }
    fn serialize_tuple_variant(&mut self, name: &'static str, _variant_index: usize, _variant: &'static str, len: usize) -> Result<Self::TupleVariantState, Self::Error> {
        self.serialize_tuple_struct(name, len)
    }
    fn serialize_tuple_variant_elt<T: Serialize>(&mut self, _state: &mut Self::TupleVariantState, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_tuple_variant_end(&mut self, _state: Self::TupleVariantState) -> Result<(), Self::Error> {
        self.serialize_tuple_struct_end(())
    }
    fn serialize_map(&mut self, _len: Option<usize>) -> Result<Self::MapState, Self::Error> {
        self.start_dict();
        Ok(())
    }
    fn serialize_map_key<T: Serialize>(&mut self, _state: &mut Self::MapState, key: T) -> Result<(), Self::Error> {
        key.serialize(self)
    }
    fn serialize_map_value<T: Serialize>(&mut self, _state: &mut Self::MapState, value: T) -> Result<(), Self::Error> {
        value.serialize(self)
    }
    fn serialize_map_end(&mut self, _state: Self::MapState) -> Result<(), Self::Error> {
        self.end_dict();
        Ok(())
    }
    fn serialize_struct(&mut self, _name: &'static str, _len: usize) -> Result<Self::StructState, Self::Error> {
        self.start_dict();
        Ok(())
    }
    fn serialize_struct_elt<V: Serialize>(&mut self, _state: &mut Self::StructState, key: &'static str, value: V) -> Result<(), Self::Error> {
        key.serialize(self).unwrap();
        value.serialize(self).unwrap();
        Ok(())
    }
    fn serialize_struct_end(&mut self, _state: Self::StructState) -> Result<(), Self::Error> {
        self.end_dict();
        Ok(())
    }
    fn serialize_struct_variant(&mut self, name: &'static str, _variant_index: usize, _variant: &'static str, len: usize) -> Result<Self::StructVariantState, Self::Error> {
        self.serialize_struct(name, len)
    }
    fn serialize_struct_variant_elt<V: Serialize>(&mut self, _state: &mut Self::StructVariantState, key: &'static str, value: V) -> Result<(), Self::Error> {
        key.serialize(self).unwrap();
        value.serialize(self).unwrap();
        Ok(())
    }
    fn serialize_struct_variant_end(&mut self, _state: Self::StructVariantState) -> Result<(), Self::Error> {
        self.serialize_struct_end(())
    }
}