slacker 0.1.3

Slacker server built on top of tokio.
Documentation
use std::io::{Result, Error, ErrorKind};

use serde::Serialize;

use serde_json;
use serde_json::value::Value as Json;

pub trait Serializer: Send + Sync + 'static {
    type Format: Serialize + Send + Sync + 'static;

    fn serialize(&self, t: &Self::Format) -> Result<Vec<u8>>;

    fn deserialize(&self, f: &[u8]) -> Result<Self::Format>;

    fn deserialize_vec(&self, f: &[u8]) -> Result<Vec<Self::Format>>;
}

pub struct JsonSerializer;

impl Serializer for JsonSerializer {
    type Format = Json;

    fn serialize(&self, t: &Self::Format) -> Result<Vec<u8>> {
        serde_json::to_string(t)
            .map(|r| r.as_bytes().into())
            .map_err(|e| Error::new(ErrorKind::InvalidData, e))
    }

    fn deserialize(&self, f: &[u8]) -> Result<Self::Format> {
        serde_json::from_slice(f).map_err(|e| Error::new(ErrorKind::InvalidData, e))
    }

    fn deserialize_vec(&self, f: &[u8]) -> Result<Vec<Self::Format>> {
        self.deserialize(f).and_then(|v| match v {
            Json::Array(a) => Ok(a),
            _ => Err(Error::new(ErrorKind::InvalidData, "Array required.")),
        })
    }
}