net_relay/
builder.rs

1use crate::error::Error;
2use std::net::{SocketAddr, ToSocketAddrs};
3use std::sync::Arc;
4
5pub struct Parts<P, F> {
6    /// 监听地址
7    pub bind_addrs: Vec<SocketAddr>,
8    /// 连接池
9    pub pools: Vec<Arc<P>>,
10    /// 服务处理器
11    pub relay_fn: Option<Arc<F>>,
12    /// 是否使用tls, only for https
13    pub use_tls: Option<bool>,
14    /// 最大并发流, only for http2
15    pub max_streams: Option<u32>,
16}
17
18pub struct Builder<P, F> {
19    inner: Result<Parts<P, F>, Error>,
20}
21
22impl<P, F> Builder<P, F> {
23    pub fn new() -> Self {
24        Builder {
25            inner: Ok(Parts {
26                bind_addrs: Vec::new(),
27                pools: vec![],
28                relay_fn: None,
29                use_tls: None,
30                max_streams: None,
31            }),
32        }
33    }
34
35    pub fn pool(self, p: P) -> Self {
36        Builder {
37            inner: self.inner.and_then(move |mut inner| {
38                inner.pools.push(Arc::new(p));
39                Ok(inner)
40            }),
41        }
42    }
43
44    pub fn relay_fn(self, f: F) -> Self {
45        Builder {
46            inner: self.inner.and_then(move |mut inner| {
47                inner.relay_fn = Some(Arc::new(f));
48                Ok(inner)
49            }),
50        }
51    }
52
53    pub fn bind<A: ToSocketAddrs>(self, addr: A) -> Self {
54        Builder {
55            inner: self.inner.and_then(move |mut inner| {
56                let addrs: Vec<SocketAddr> = addr.to_socket_addrs()?.collect();
57                inner.bind_addrs = addrs;
58                Ok(inner)
59            }),
60        }
61    }
62
63    pub fn max_streams(self, max: Option<u32>) -> Self {
64        Builder {
65            inner: self.inner.and_then(move |mut inner| {
66                inner.max_streams = max;
67                Ok(inner)
68            }),
69        }
70    }
71
72    pub fn build(self) -> Result<Parts<P, F>, Error> {
73        let parts = self.inner?;
74        if parts.pools.is_empty() {
75            Err(Error::NoPool)
76        } else if parts.bind_addrs.is_empty() {
77            Err(Error::NoBindAddress)
78        } else if parts.relay_fn.is_none() {
79            Err(Error::NoRelayFn)
80        } else {
81            Ok(parts)
82        }
83    }
84}