use std::convert::Infallible;
use crate::{CreatePoolError, Manager, Pool, PoolBuilder, PoolConfig, Runtime};
#[derive(Clone, Debug, Default)]
pub struct Config {
pub addr: Option<String>,
pub pool: Option<PoolConfig>,
}
impl Config {
#[must_use]
pub fn new(addr: impl Into<String>) -> Self {
Self {
addr: Some(addr.into()),
pool: None,
}
}
pub fn create_pool(&self, runtime: Option<Runtime>) -> Result<Pool, CreatePoolError> {
let mut builder = self.builder().map_err(CreatePoolError::Config)?;
if let Some(runtime) = runtime {
builder = builder.runtime(runtime);
}
builder.build().map_err(CreatePoolError::Build)
}
pub fn builder(&self) -> Result<PoolBuilder, ConfigError> {
let manager = Manager::new(self.get_addr());
Ok(Pool::builder(manager).config(self.get_pool_config()))
}
pub fn get_addr(&self) -> &str {
self.addr.as_deref().unwrap_or("127.0.0.1:11211")
}
#[must_use]
pub fn get_pool_config(&self) -> PoolConfig {
self.pool.unwrap_or_default()
}
}
pub type ConfigError = Infallible;
#[cfg(test)]
mod tests {
use super::Config;
#[test]
fn default_addr_is_localhost() {
let cfg = Config::default();
assert_eq!(cfg.get_addr(), "127.0.0.1:11211");
}
#[test]
fn new_sets_addr() {
let cfg = Config::new("cache.internal:11211");
assert_eq!(cfg.get_addr(), "cache.internal:11211");
}
}