1use tokio::io::{AsyncRead, AsyncWrite};
2use std::str::FromStr;
3use std::time::Duration;
4
5pub trait IOStream: AsyncRead + AsyncWrite + Unpin {}
9
10impl<T> IOStream for T
14where
15 T: AsyncRead + AsyncWrite + Unpin {}
16
17#[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
40impl FromStr for ConnectionTimeouts {
45 type Err = ();
46
47 fn from_str(s: &str) -> Result<ConnectionTimeouts, Self::Err> {
48 let mut s = s.split(":");
51
52 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 Ok(ConnectionTimeouts::new(
72 Duration::from_millis(ct),
73 Duration::from_millis(rt),
74 Duration::from_millis(wt)
75 ))
76 }
77}