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}