1use crate::error::Error;
2use std::net::{SocketAddr, ToSocketAddrs};
3use std::sync::Arc;
4
5pub struct Parts<P, F> {
6 pub bind_addrs: Vec<SocketAddr>,
8 pub pools: Vec<Arc<P>>,
10 pub relay_fn: Option<Arc<F>>,
12 pub use_tls: Option<bool>,
14 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}