use anyhow::Result;
use super::types::{Config, InteractiveConfig, InteractiveConfigUpdate};
impl Config {
pub fn get_interactive_config(&self, cluster_name: Option<&str>) -> InteractiveConfig {
let mut config = self.interactive.clone();
if let Some(cluster_name) = cluster_name {
if let Some(cluster) = self.get_cluster(cluster_name) {
if let Some(ref cluster_interactive) = cluster.interactive {
config.default_mode = cluster_interactive.default_mode.clone();
if !cluster_interactive.prompt_format.is_empty() {
config.prompt_format = cluster_interactive.prompt_format.clone();
}
if cluster_interactive.history_file.is_some() {
config.history_file = cluster_interactive.history_file.clone();
}
if cluster_interactive.work_dir.is_some() {
config.work_dir = cluster_interactive.work_dir.clone();
}
if cluster_interactive.broadcast_prefix.is_some() {
config.broadcast_prefix = cluster_interactive.broadcast_prefix.clone();
}
if cluster_interactive.node_switch_prefix.is_some() {
config.node_switch_prefix = cluster_interactive.node_switch_prefix.clone();
}
config.show_timestamps = cluster_interactive.show_timestamps;
for (k, v) in &cluster_interactive.colors {
config.colors.insert(k.clone(), v.clone());
}
if !cluster_interactive.keybindings.switch_node.is_empty() {
config.keybindings.switch_node =
cluster_interactive.keybindings.switch_node.clone();
}
if !cluster_interactive.keybindings.broadcast_toggle.is_empty() {
config.keybindings.broadcast_toggle =
cluster_interactive.keybindings.broadcast_toggle.clone();
}
if !cluster_interactive.keybindings.quit.is_empty() {
config.keybindings.quit = cluster_interactive.keybindings.quit.clone();
}
if cluster_interactive.keybindings.clear_screen.is_some() {
config.keybindings.clear_screen =
cluster_interactive.keybindings.clear_screen.clone();
}
}
}
}
config
}
pub async fn update_interactive_preferences(
&mut self,
cluster_name: Option<&str>,
updates: InteractiveConfigUpdate,
) -> Result<()> {
let target_config = if let Some(cluster_name) = cluster_name {
if let Some(cluster) = self.clusters.get_mut(cluster_name) {
if cluster.interactive.is_none() {
cluster.interactive = Some(InteractiveConfig::default());
}
cluster
.interactive
.as_mut()
.expect("interactive config should exist after initialization")
} else {
&mut self.interactive
}
} else {
&mut self.interactive
};
if let Some(mode) = updates.default_mode {
target_config.default_mode = mode;
}
if let Some(prompt) = updates.prompt_format {
target_config.prompt_format = prompt;
}
if let Some(history) = updates.history_file {
target_config.history_file = Some(history);
}
if let Some(work_dir) = updates.work_dir {
target_config.work_dir = Some(work_dir);
}
if let Some(timestamps) = updates.show_timestamps {
target_config.show_timestamps = timestamps;
}
if let Some(colors) = updates.colors {
target_config.colors.extend(colors);
}
let config_path = self.get_config_path()?;
self.save(&config_path).await?;
Ok(())
}
}