use std::{
collections::BTreeMap,
mem::swap,
};
use serde::{
Deserialize,
Serialize,
};
use crate::cluster::sized_int::{
ChunkSize,
DataChunkCount,
ParityChunkCount,
};
#[derive(Clone, Serialize, Deserialize)]
pub struct ClusterProfiles {
default: ClusterProfile,
#[serde(flatten)]
custom: BTreeMap<String, ClusterProfile>,
}
impl ClusterProfiles {
pub fn get<'a>(&self, profile: impl Into<Option<&'a str>>) -> Option<&'_ ClusterProfile> {
let profile = profile.into();
match profile {
Some("default") | None => Some(&self.default),
Some(profile) => self.custom.get(profile),
}
}
pub fn insert(
&mut self,
name: impl Into<Option<String>>,
profile: ClusterProfile,
) -> Option<ClusterProfile> {
let name = name.into();
match name.as_deref() {
Some("default") | None => {
let mut profile = profile;
swap(&mut self.default, &mut profile);
Some(profile)
},
Some(_name) => {
let name = name.unwrap();
self.custom.insert(name, profile)
},
}
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct ClusterProfile {
#[serde(default)]
pub chunk_size: ChunkSize,
#[serde(alias = "data")]
pub data_chunks: DataChunkCount,
#[serde(alias = "parity")]
pub parity_chunks: ParityChunkCount,
#[serde(default)]
#[serde(alias = "zone")]
#[serde(alias = "zones")]
#[serde(alias = "rules")]
pub zone_rules: ZoneRules,
}
impl ClusterProfile {
pub fn get_chunk_size(&self) -> usize {
self.chunk_size.into()
}
pub fn get_data_chunks(&self) -> usize {
self.data_chunks.into()
}
pub fn get_parity_chunks(&self) -> usize {
self.parity_chunks.into()
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct ZoneRules(pub BTreeMap<String, ZoneRule>);
impl AsRef<BTreeMap<String, ZoneRule>> for ZoneRules {
fn as_ref(&self) -> &BTreeMap<String, ZoneRule> {
&self.0
}
}
impl AsMut<BTreeMap<String, ZoneRule>> for ZoneRules {
fn as_mut(&mut self) -> &mut BTreeMap<String, ZoneRule> {
&mut self.0
}
}
impl Default for ZoneRules {
fn default() -> Self {
ZoneRules(BTreeMap::new())
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct ZoneRule {
#[serde(default)]
pub minimum: i8,
pub maximum: Option<i8>,
#[serde(default)]
pub ideal: i8,
}