slacker/
lib.rs

1#![allow(dead_code, unused_must_use)]
2#[macro_use]
3extern crate log;
4#[macro_use]
5extern crate nom;
6
7extern crate tokio_io as tio;
8extern crate tokio_core as tcore;
9extern crate tokio_proto as tproto;
10extern crate tokio_service as tservice;
11extern crate futures;
12extern crate futures_cpupool;
13extern crate serde;
14extern crate serde_json;
15extern crate bytes;
16extern crate byteorder;
17
18mod codecs;
19mod parser;
20mod service;
21mod serializer;
22mod client;
23mod json;
24
25use tproto::TcpServer;
26use tproto::multiplex::{ClientProto, ServerProto};
27use tio::AsyncRead;
28use tio::codec::Framed;
29use tcore::net::TcpStream;
30
31use std::collections::BTreeMap;
32use std::io;
33use std::sync::Arc;
34use std::net::SocketAddr;
35
36use codecs::*;
37use serializer::*;
38use parser::*;
39use service::*;
40use json::*;
41pub use json::{JsonRpcFn, JsonRpcFnSync};
42pub use client::{Client, ClientManager};
43
44impl ServerProto<TcpStream> for JsonSlacker {
45    type Request = SlackerPacket;
46    type Response = SlackerPacket;
47    type Transport = Framed<TcpStream, SlackerCodec>;
48    type BindTransport = io::Result<Self::Transport>;
49
50    fn bind_transport(&self, io: TcpStream) -> Self::BindTransport {
51        io.set_nodelay(true);
52        Ok(io.framed(SlackerCodec))
53    }
54}
55
56pub struct Server {
57    addr: SocketAddr,
58    funcs: Arc<BTreeMap<String, JsonRpcFn>>,
59}
60
61impl Server {
62    pub fn new(addr: SocketAddr, funcs: BTreeMap<String, JsonRpcFn>) -> Self {
63        Server {
64            addr,
65            funcs: Arc::new(funcs),
66        }
67    }
68
69    pub fn serve(&self) {
70        let serializer = Arc::new(JsonSerializer);
71        let funcs_ref = self.funcs.clone();
72        TcpServer::new(JsonSlacker, self.addr).serve(move || {
73            Ok(SlackerService::new(funcs_ref.clone(), serializer.clone()))
74        });
75    }
76}
77
78pub struct ThreadPoolServer {
79    addr: SocketAddr,
80    funcs: Arc<BTreeMap<String, JsonRpcFnSync>>,
81    threads: usize,
82}
83
84impl ThreadPoolServer {
85    pub fn new(addr: SocketAddr, funcs: BTreeMap<String, JsonRpcFnSync>, threads: usize) -> Self {
86        ThreadPoolServer {
87            addr,
88            funcs: Arc::new(funcs),
89            threads,
90        }
91    }
92
93    pub fn serve(&self) {
94        let serializer = Arc::new(JsonSerializer);
95        let funcs_ref = self.funcs.clone();
96        let threads = self.threads;
97        TcpServer::new(JsonSlacker, self.addr).serve(move || {
98            Ok(SlackerServiceSync::new(
99                funcs_ref.clone(),
100                serializer.clone(),
101                threads,
102            ))
103        });
104    }
105}
106
107impl ClientProto<TcpStream> for JsonSlacker {
108    type Request = SlackerPacket;
109    type Response = SlackerPacket;
110    type Transport = Framed<TcpStream, SlackerCodec>;
111    type BindTransport = io::Result<Self::Transport>;
112
113    fn bind_transport(&self, io: TcpStream) -> Self::BindTransport {
114        io.set_nodelay(true);
115        Ok(io.framed(SlackerCodec))
116    }
117}