use std::net::SocketAddr;
use serde::Deserialize;
use serde::Serialize;
use super::default::default_raft_config;
use super::default::default_rocksdb_config;
use crate::error::Result;
use crate::error::StartupError;
#[derive(Debug, Deserialize, Serialize, Clone, Default)]
pub struct Config {
pub node_id: u64,
#[serde(default = "default_raft_config")]
pub raft: RaftConfig,
#[serde(default = "default_rocksdb_config")]
pub rocksdb: RocksdbConfig,
}
#[derive(Debug, Deserialize, Serialize, Clone, Default)]
pub struct RocksdbConfig {
pub data_path: String,
pub max_open_files: i32,
}
#[derive(Debug, Deserialize, Serialize, Clone, Default)]
pub struct RaftConfig {
pub address: String,
pub advertise_host: String,
pub single: bool,
pub join: Vec<String>,
}
impl Config {
pub fn validate(&self) -> Result<()> {
if self.raft.single && !self.raft.join.is_empty() {
return Err(
StartupError::invalid_config(
"'single' mode cannot be used together with 'join' configuration",
)
.into(),
);
}
let _a: SocketAddr = self.raft.address.parse().map_err(|e| {
StartupError::InvalidConfig(format!("{} while parsing {}", e, self.raft.address))
})?;
Ok(())
}
}