use std::{collections::BTreeMap, path::PathBuf};
use bevy::{platform::collections::HashSet, prelude::*};
use serde::{Deserialize, Serialize};
use crate::paths::config_dir;
#[derive(Serialize, Deserialize, Default, Deref, DerefMut)]
pub struct ExtensionsConfig(BTreeMap<String, ExtensionConfig>);
#[derive(Serialize, Deserialize)]
pub struct ExtensionConfig {
pub enabled: bool,
}
impl Default for ExtensionConfig {
fn default() -> Self {
Self { enabled: true }
}
}
fn config_path() -> Option<PathBuf> {
config_dir().map(|d| d.join("extensions.json"))
}
pub fn read_extension_config() -> Option<ExtensionsConfig> {
let path = config_path()?;
let data = std::fs::read_to_string(&path).ok()?;
serde_json::from_str(&data).ok()
}
pub fn init_extension(id: impl Into<String>) {
let id = id.into();
let mut config = read_extension_config().unwrap_or_default();
config.entry(id).or_default().enabled = true;
write_enabled_list(&config);
}
pub fn write_enabled_list(config: &ExtensionsConfig) {
let Some(path) = config_path() else {
return;
};
if let Some(parent) = path.parent() {
let _ = std::fs::create_dir_all(parent);
}
if let Ok(data) = serde_json::to_string_pretty(&config) {
let _ = std::fs::write(&path, data);
}
}
pub fn persist_current_enabled(world: &mut World) {
let mut query = world.query::<&crate::lifecycle::Extension>();
let enabled: HashSet<String> = query.iter(world).map(|e| e.id.clone()).collect();
let mut config = read_extension_config().unwrap_or_default();
for (id, ext_config) in config.iter_mut() {
if !enabled.contains(id) {
ext_config.enabled = false;
}
}
for id in enabled {
config.entry(id).or_default().enabled = true;
}
write_enabled_list(&config);
}