tcpserver/
builder.rs

1use crate::{ConnectEventType, TCPPeer, TCPServer};
2
3use aqueue::Actor;
4use std::future::Future;
5use std::marker::PhantomData;
6use std::sync::Arc;
7use tokio::io::{AsyncRead, AsyncWrite, ReadHalf};
8use tokio::net::{TcpStream, ToSocketAddrs};
9
10/// TCP server builder
11pub struct Builder<I, R, A, T, B, C, IST> {
12    input: Option<I>,
13    connect_event: Option<ConnectEventType>,
14    stream_init: Option<IST>,
15    addr: A,
16    _phantom1: PhantomData<R>,
17    _phantom2: PhantomData<T>,
18    _phantom3: PhantomData<C>,
19    _phantom4: PhantomData<B>,
20}
21
22impl<I, R, A, T, B, C, IST> Builder<I, R, A, T, B, C, IST>
23where
24    I: Fn(ReadHalf<C>, Arc<Actor<TCPPeer<C>>>, T) -> R + Send + Sync + 'static,
25    R: Future<Output = anyhow::Result<()>> + Send + 'static,
26    A: ToSocketAddrs,
27    T: Clone + Send + 'static,
28    B: Future<Output = anyhow::Result<C>> + Send + 'static,
29    C: AsyncRead + AsyncWrite + Send + 'static,
30    IST: Fn(TcpStream) -> B + Send + Sync + 'static,
31{
32    pub fn new(addr: A) -> Builder<I, R, A, T, B, C, IST> {
33        Builder {
34            input: None,
35            connect_event: None,
36            stream_init: None,
37            addr,
38            _phantom1: Default::default(),
39            _phantom2: Default::default(),
40            _phantom3: Default::default(),
41            _phantom4: Default::default(),
42        }
43    }
44
45    /// 设置TCP server 输入事件
46    pub fn set_input_event(mut self, f: I) -> Self {
47        self.input = Some(f);
48        self
49    }
50
51    /// 设置TCP server 连接事件
52    pub fn set_connect_event(mut self, c: ConnectEventType) -> Self {
53        self.connect_event = Some(c);
54        self
55    }
56
57    /// 设置输入流类型,例如TCPStream,SSLStream or GZIPStream
58    pub fn set_stream_init(mut self, c: IST) -> Self {
59        self.stream_init = Some(c);
60        self
61    }
62
63    /// 生成TCPSERVER,如果没有设置 tcp input 将报错
64    pub async fn build(mut self) -> Arc<Actor<TCPServer<I, R, T, B, C, IST>>> {
65        if let Some(input) = self.input.take() {
66            if let Some(stream_init) = self.stream_init.take() {
67                return if let Some(connect) = self.connect_event.take() {
68                    TCPServer::new(self.addr, stream_init, input, Some(connect))
69                        .await
70                        .unwrap()
71                } else {
72                    TCPServer::new(self.addr, stream_init, input, None)
73                        .await
74                        .unwrap()
75                };
76            }
77            panic!("stream_init is no settings,please use set_stream_init function.");
78        }
79        panic!("input event is no settings,please use set_input_event function set input event.");
80    }
81}