use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SitesFile {
#[serde(default)]
pub default_site: Option<String>,
#[serde(default)]
pub sites: BTreeMap<String, SiteEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SiteEntry {
pub path: PathBuf,
}
impl SitesFile {
pub fn resolve_name<'a>(&'a self, cli_site: Option<&'a str>) -> Option<&'a str> {
if let Some(name) = cli_site
&& !name.is_empty()
&& self.sites.contains_key(name)
{
return Some(name);
}
if let Ok(env) = std::env::var("OXIPAGE_SITE")
&& !env.is_empty()
&& self.sites.contains_key(&env)
{
return self.sites.get_key_value(&env).map(|(k, _)| k.as_str());
}
self.default_site
.as_deref()
.and_then(|name| self.sites.contains_key(name).then_some(name))
}
pub fn exists(&self, name: &str) -> bool {
self.sites.contains_key(name)
}
pub fn get(&self, name: &str) -> Option<&SiteEntry> {
self.sites.get(name)
}
pub fn site_names(&self) -> Vec<String> {
let mut names: Vec<String> = self.sites.keys().cloned().collect();
names.sort();
names
}
pub fn add(&mut self, slug: String, path: PathBuf) -> Option<SiteEntry> {
self.sites.insert(slug, SiteEntry { path })
}
pub fn remove(&mut self, slug: &str) -> Option<SiteEntry> {
self.sites.remove(slug)
}
pub fn set_default(&mut self, slug: &str) {
if !slug.is_empty() {
self.default_site = Some(slug.to_string());
}
}
}