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
10pub 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 pub fn set_input_event(mut self, f: I) -> Self {
47 self.input = Some(f);
48 self
49 }
50
51 pub fn set_connect_event(mut self, c: ConnectEventType) -> Self {
53 self.connect_event = Some(c);
54 self
55 }
56
57 pub fn set_stream_init(mut self, c: IST) -> Self {
59 self.stream_init = Some(c);
60 self
61 }
62
63 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}