use std::io::Result;
use std::time::Duration;
use io_error::*;
pub struct Config {
pub send_timeout: Option<Duration>,
pub send_priority: u8,
pub recv_timeout: Option<Duration>,
pub recv_priority: u8,
pub retry_ivl: Duration,
pub retry_ivl_max: Option<Duration>,
pub tcp_no_delay: bool,
pub recv_max_size: u64
}
pub enum ConfigOption {
Linger(Duration),
SendTimeout(Option<Duration>),
SendPriority(u8),
RecvTimeout(Option<Duration>),
RecvPriority(u8),
RecvMaxSize(u64),
RetryIvl(Duration),
RetryIvlMax(Option<Duration>),
TcpNoDelay(bool),
Subscribe(String),
Unsubscribe(String),
ReqResendIvl(Duration),
SurveyDeadline(Duration)
}
impl Default for Config {
fn default() -> Config {
Config {
send_timeout: None,
send_priority: 8,
recv_timeout: None,
recv_priority: 8,
retry_ivl: Duration::from_millis(100),
retry_ivl_max: None,
tcp_no_delay: false,
recv_max_size: 1024 * 1024
}
}
}
impl Config {
pub fn set(&mut self, cfg_opt: ConfigOption) -> Result<()> {
match cfg_opt {
ConfigOption::SendTimeout(timeout) => self.send_timeout = timeout,
ConfigOption::SendPriority(priority) => self.send_priority = priority,
ConfigOption::RecvTimeout(timeout) => self.recv_timeout = timeout,
ConfigOption::RecvPriority(priority) => self.recv_priority = priority,
ConfigOption::RetryIvl(ivl) => self.retry_ivl = ivl,
ConfigOption::RetryIvlMax(ivl) => self.retry_ivl_max = ivl,
ConfigOption::RecvMaxSize(x) => self.recv_max_size = x,
ConfigOption::TcpNoDelay(x) => self.tcp_no_delay = x,
_ => return Err(invalid_input_io_error("option not supported"))
}
Ok(())
}
}
impl ConfigOption {
#[doc(hidden)]
pub fn is_generic(&self) -> bool {
match *self {
ConfigOption::Linger(_) |
ConfigOption::SendTimeout(_) |
ConfigOption::SendPriority(_) |
ConfigOption::RecvTimeout(_) |
ConfigOption::RecvPriority(_) |
ConfigOption::RetryIvl(_) |
ConfigOption::RetryIvlMax(_) |
ConfigOption::TcpNoDelay(_) => true,
_ => false
}
}
}