pub use crate::config::ConfigError;
use crate::ConnectionInfo;
use super::{CreatePoolError, Pool, PoolBuilder, PoolConfig, Runtime};
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Config {
pub urls: Option<Vec<String>>,
pub connections: Option<Vec<ConnectionInfo>>,
pub pool: Option<PoolConfig>,
}
impl Config {
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 = match (&self.urls, &self.connections) {
(Some(urls), None) => {
super::Manager::new(urls.iter().map(|url| url.as_str()).collect())?
}
(None, Some(connections)) => super::Manager::new(connections.clone())?,
(None, None) => super::Manager::new(vec![ConnectionInfo::default()])?,
(Some(_), Some(_)) => return Err(ConfigError::UrlAndConnectionSpecified),
};
let pool_config = self.get_pool_config();
Ok(Pool::builder(manager).config(pool_config))
}
#[must_use]
pub fn get_pool_config(&self) -> PoolConfig {
self.pool.unwrap_or_default()
}
#[must_use]
pub fn from_urls<T: Into<Vec<String>>>(urls: T) -> Config {
Config {
urls: Some(urls.into()),
connections: None,
pool: None,
}
}
}
impl Default for Config {
fn default() -> Self {
Self {
urls: None,
connections: Some(vec![ConnectionInfo::default()]),
pool: None,
}
}
}