cram 0.1.2

Cram realy awesome middleware
Documentation
use std::boxed::Box;
use std::collections::HashMap;
use std::ops::Fn;
use std::thread;
use std::vec::Vec;
use crossbeam::{Receiver,Sender};
use std::sync::Arc;

use crate::serializers::*;
use crate::node::thread_pool::ThreadMessage;

use super::Label;

impl Label {
    pub fn new<F>( default_fun: F, input_channel : Receiver<Vec<u8>> ) -> Label 
    where
        F: Fn(Vec<u8>) + Send + Sync + 'static,
    {

        Label {          
            input_channel: input_channel,
          
            default_fun : Arc::new( Box::new( default_fun)),
            map : HashMap::new(),
        }
    }
    

    pub fn start(self, s : Sender<ThreadMessage>){

        thread::spawn(move || loop {

            let vec;
            
            match self.input_channel.recv() {
                Ok(val) => vec = val,
                Err(_e) => break,
            }

            let (label,msg) = deserialize_label_message(vec);
            
            match self.map.get(&label) {
                None => {
                    let tm = ThreadMessage::new_with_stateless( self.default_fun.clone(), msg);
                    s.send(tm).unwrap();        
                }
                Some(f) =>{
                    let tm = ThreadMessage::new_with_stateless( f.clone(), msg);
                    s.send(tm).unwrap();
                }
            };
        });
    }

    pub fn add_handlers(&mut self, list :  Vec<( String, Box<Fn(Vec<u8>) + Send + Sync + 'static >)>){

        for (l,f) in list{
            self.map.insert(l, Arc::new(f));
        }
    }

}