qubit_http/options/
timeout_options.rs1use std::time::Duration;
11
12use qubit_config::{ConfigReader, ConfigResult};
13
14use super::HttpConfigError;
15use crate::constants::{
16 DEFAULT_CONNECT_TIMEOUT_SECS, DEFAULT_READ_TIMEOUT_SECS, DEFAULT_WRITE_TIMEOUT_SECS,
17};
18
19#[derive(Debug, Clone, PartialEq, Eq)]
21pub struct TimeoutOptions {
22 pub connect_timeout: Duration,
24 pub read_timeout: Duration,
26 pub write_timeout: Duration,
28 pub request_timeout: Option<Duration>,
30}
31
32impl Default for TimeoutOptions {
33 fn default() -> Self {
41 Self {
42 connect_timeout: Duration::from_secs(DEFAULT_CONNECT_TIMEOUT_SECS),
43 read_timeout: Duration::from_secs(DEFAULT_READ_TIMEOUT_SECS),
44 write_timeout: Duration::from_secs(DEFAULT_WRITE_TIMEOUT_SECS),
45 request_timeout: None,
46 }
47 }
48}
49
50struct TimeoutConfigInput {
51 connect_timeout: Option<Duration>,
52 read_timeout: Option<Duration>,
53 write_timeout: Option<Duration>,
54 request_timeout: Option<Duration>,
55}
56
57fn read_timeout_config<R>(config: &R) -> ConfigResult<TimeoutConfigInput>
58where
59 R: ConfigReader + ?Sized,
60{
61 Ok(TimeoutConfigInput {
62 connect_timeout: config.get_optional("connect_timeout")?,
63 read_timeout: config.get_optional("read_timeout")?,
64 write_timeout: config.get_optional("write_timeout")?,
65 request_timeout: config.get_optional("request_timeout")?,
66 })
67}
68
69impl TimeoutOptions {
70 pub fn from_config<R>(config: &R) -> Result<Self, HttpConfigError>
85 where
86 R: ConfigReader + ?Sized,
87 {
88 let raw = read_timeout_config(config).map_err(HttpConfigError::from)?;
89
90 let mut opts = TimeoutOptions::default();
91 if let Some(d) = raw.connect_timeout {
92 opts.connect_timeout = d;
93 }
94 if let Some(d) = raw.read_timeout {
95 opts.read_timeout = d;
96 }
97 if let Some(d) = raw.write_timeout {
98 opts.write_timeout = d;
99 }
100 opts.request_timeout = raw.request_timeout;
101
102 Ok(opts)
103 }
104}