use std::time::Duration;
use serde::{Deserialize, Serialize};
use crate::{CapabilitySet, StorageError, StorageLocator};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CommonConfig {
pub default_locator: Option<StorageLocator>,
pub connect_timeout_ms: u64,
pub request_timeout_ms: u64,
pub read_only: bool,
pub required_capabilities: CapabilitySet,
}
impl Default for CommonConfig {
fn default() -> Self {
Self {
default_locator: None,
connect_timeout_ms: 15_000,
request_timeout_ms: 30_000,
read_only: false,
required_capabilities: CapabilitySet::empty(),
}
}
}
impl CommonConfig {
pub(crate) fn validate(&self) -> Result<(), StorageError> {
if self.connect_timeout_ms == 0 {
return Err(StorageError::InvalidConfig(
"connect_timeout_ms must be greater than zero".into(),
));
}
if self.request_timeout_ms == 0 {
return Err(StorageError::InvalidConfig(
"request_timeout_ms must be greater than zero".into(),
));
}
if let Some(locator) = &self.default_locator {
locator.validate_for_config("default_locator")?;
}
Ok(())
}
pub(crate) fn connect_timeout(&self) -> Duration {
Duration::from_millis(self.connect_timeout_ms)
}
pub(crate) fn request_timeout(&self) -> Duration {
Duration::from_millis(self.request_timeout_ms)
}
pub(crate) fn ensure_mutable(&self, operation: &'static str) -> Result<(), StorageError> {
if self.read_only {
return Err(StorageError::backend_op(
operation,
format!(
"operation `{operation}` is disabled because the database is configured read-only"
),
));
}
Ok(())
}
}