use std::default::Default;
use std::error::Error;
use std::fmt;
use std::time::Duration;
#[derive(Copy, Clone, Debug)]
pub struct Config {
pub pool_size: u32,
pub helper_tasks: u32,
pub test_on_check_out: bool,
pub initialization_fail_fast: bool,
pub connection_timeout: Duration,
}
impl Default for Config {
fn default() -> Config {
Config {
pool_size: 10,
helper_tasks: 3,
test_on_check_out: true,
initialization_fail_fast: true,
connection_timeout: Duration::seconds(30),
}
}
}
impl Config {
pub fn validate(&self) -> Result<(), ConfigError> {
if self.pool_size == 0 {
return Err(ConfigError::ZeroPoolSize);
}
if self.helper_tasks == 0 {
return Err(ConfigError::ZeroHelperTasks);
}
if self.connection_timeout <= Duration::zero() {
return Err(ConfigError::NonPositiveConnectionTimeout);
}
Ok(())
}
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum ConfigError {
ZeroPoolSize,
ZeroHelperTasks,
NonPositiveConnectionTimeout,
}
impl fmt::Display for ConfigError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.write_str(self.description())
}
}
impl Error for ConfigError {
fn description(&self) -> &str {
match *self {
ConfigError::ZeroPoolSize => "pool_size must be positive",
ConfigError::ZeroHelperTasks => "helper_tasks must be positive",
ConfigError::NonPositiveConnectionTimeout => "connection_timeout must be positive",
}
}
}