use crate::ConnectionInfo;
pub use crate::config::ConfigError;
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>,
#[cfg_attr(feature = "serde", serde(default))]
pub read_from_replicas: bool,
}
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(),
self.read_from_replicas,
)?,
(None, Some(connections)) => {
super::Manager::new(connections.clone(), self.read_from_replicas)?
}
(None, None) => {
super::Manager::new(vec![ConnectionInfo::default()], self.read_from_replicas)?
}
(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,
read_from_replicas: false,
}
}
}
impl Default for Config {
fn default() -> Self {
Self {
urls: None,
connections: Some(vec![ConnectionInfo::default()]),
pool: None,
read_from_replicas: false,
}
}
}