use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::{
OpenTalkAccountConfig, OpenTalkAccountId, OpenTalkInstanceAccountId, OpenTalkInstanceId,
opentalk_instance_config::OpenTalkInstanceConfig,
};
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
pub struct Config {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_instance: Option<OpenTalkInstanceId>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub instances: BTreeMap<OpenTalkInstanceId, OpenTalkInstanceConfig>,
}
impl Config {
pub fn get_default_instance(&self) -> Option<(OpenTalkInstanceId, OpenTalkInstanceConfig)> {
let instance_id = self.default_instance.clone()?;
let instance = self.get_instance(&instance_id)?.clone();
Some((instance_id, instance))
}
pub fn get_instance(&self, instance_id: &OpenTalkInstanceId) -> Option<OpenTalkInstanceConfig> {
self.instances.get(instance_id).cloned()
}
pub fn get_default_account(
&self,
) -> Option<(OpenTalkInstanceAccountId, OpenTalkAccountConfig)> {
let (instance_id, instance) = self.get_default_instance()?;
let (account_id, account) = instance.get_default_account()?;
Some(((instance_id.clone(), account_id).into(), account))
}
pub fn get_instance_with_fallback_to_default(
&self,
instance_id: Option<&OpenTalkInstanceId>,
) -> Option<(OpenTalkInstanceId, OpenTalkInstanceConfig)> {
if let Some(instance_id) = instance_id {
let instance = self.get_instance(instance_id)?;
Some((instance_id.clone(), instance.clone()))
} else {
self.get_default_instance()
}
}
pub fn get_account_with_fallback_to_default(
&self,
instance_id: Option<&OpenTalkInstanceId>,
account_id: Option<&OpenTalkAccountId>,
) -> Option<(OpenTalkInstanceAccountId, OpenTalkAccountConfig)> {
let (instance_id, instance) = self.get_instance_with_fallback_to_default(instance_id)?;
let (account_id, account) = instance.get_account_with_fallback_to_default(account_id)?;
Some(((instance_id, account_id).into(), account))
}
pub fn remove_account(
&mut self,
instance_id: Option<&OpenTalkInstanceId>,
account_id: Option<&OpenTalkAccountId>,
) {
let Some(instance_id) = self.default_instance.as_ref().or(instance_id) else {
return;
};
let Some(instance) = self.instances.get_mut(instance_id) else {
return;
};
instance.remove_account(account_id);
}
}