use crate::{Error, Result};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum ConfigLevel {
System,
User,
Project,
}
impl ConfigLevel {
pub fn path(&self) -> Result<PathBuf> {
match self {
ConfigLevel::System => Ok(PathBuf::from("/etc/ferrous-forge/config.toml")),
ConfigLevel::User => {
let config_dir = dirs::config_dir()
.ok_or_else(|| Error::config("Could not find config directory"))?;
Ok(config_dir.join("ferrous-forge").join("config.toml"))
}
ConfigLevel::Project => Ok(PathBuf::from(".ferrous-forge/config.toml")),
}
}
pub fn display_name(&self) -> &'static str {
match self {
ConfigLevel::System => "System",
ConfigLevel::User => "User",
ConfigLevel::Project => "Project",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_level_ordering() {
assert!(ConfigLevel::System < ConfigLevel::User);
assert!(ConfigLevel::User < ConfigLevel::Project);
}
}