async_proxy/
general.rs

1use tokio::io::{AsyncRead, AsyncWrite};
2use std::str::FromStr;
3use std::time::Duration;
4
5/// General trait which implementing type
6/// represents something where we can both
7/// write to or read from
8pub trait IOStream: AsyncRead + AsyncWrite + Unpin {}
9
10/// Auto-impl for types that satisfies
11/// the trait `IOStream` requirements
12/// (`AsyncRead` and `AsyncWrite`)
13impl<T> IOStream for T
14where
15    T: AsyncRead + AsyncWrite + Unpin {}
16
17/// Just a structure containing 
18/// connecting/read/write timeouts
19#[derive(Clone)]
20pub struct ConnectionTimeouts {
21    pub connecting_timeout: Duration,
22    pub write_timeout: Duration,
23    pub read_timeout: Duration
24}
25
26impl ConnectionTimeouts {
27    pub fn new(connecting_timeout: Duration,
28               write_timeout: Duration,
29               read_timeout: Duration)
30        -> ConnectionTimeouts
31    {
32        ConnectionTimeouts { 
33            connecting_timeout,
34            write_timeout,
35            read_timeout
36        }
37    }
38}
39
40/// Parses connection timeouts in format
41/// "connection_timeout:read_timeout:write_timeout"
42/// where all timeouts are values represent milliseconds
43/// duration as u64
44impl FromStr for ConnectionTimeouts {
45    type Err = ();
46
47    fn from_str(s: &str) -> Result<ConnectionTimeouts, Self::Err> {
48        // Splitting the string on ':' to parse
49        // timeouts from them
50        let mut s = s.split(":");
51
52        // Extracting values in order:
53        // connection timeout, read timeout, write timeout
54        let (ct, rt, wt) = (
55            s.next()
56             .map(|v| v.parse::<u64>()
57                       .map_err(|_| ()))
58             .ok_or(())??, 
59            s.next()
60             .map(|v| v.parse::<u64>()
61                       .map_err(|_| ()))
62             .ok_or(())??,
63            s.next()
64             .map(|v| v.parse::<u64>()
65                       .map_err(|_| ()))
66             .ok_or(())??
67        );
68
69        // Converting the parsed values
70        // into the approrpiate durations
71        Ok(ConnectionTimeouts::new(
72            Duration::from_millis(ct),
73            Duration::from_millis(rt),
74            Duration::from_millis(wt)
75        ))
76    }
77}