use anyhow::{Context, Result};
use directories::ProjectDirs;
use serde::{Deserialize, Serialize};
use std::fs;
use std::path::PathBuf;
#[derive(Debug, Serialize, Deserialize)]
pub struct Config {
pub name: String,
pub version: String,
pub main_class: String,
#[serde(default = "default_class_dir")]
pub class_dir: String,
}
fn default_class_dir() -> String {
"target/classes".to_string()
}
pub fn load_config() -> Result<Config> {
let content = fs::read_to_string("bloomery.toml")
.context("bloomery.toml not found. Are you in the project directory?")?;
let config: Config = toml::from_str(&content).context("bloomery.toml could not be read")?;
Ok(config)
}
#[derive(Debug, Serialize, Deserialize)]
pub struct GlobalConfig {
#[serde(default = "default_template")]
pub default_template: String,
}
impl Default for GlobalConfig {
fn default() -> Self {
Self {
default_template: "default".to_string(),
}
}
}
fn default_template() -> String {
"default".to_string()
}
pub fn global_config_path() -> anyhow::Result<PathBuf> {
let proj = ProjectDirs::from("", "", "bloomery")
.ok_or_else(|| error!("Could not determine config directory"))?;
Ok(proj.config_dir().join("config.toml"))
}
pub fn load_global_config() -> anyhow::Result<GlobalConfig> {
let path = global_config_path()?;
if !path.exists() {
return Ok(GlobalConfig::default());
}
let content = fs::read_to_string(&path)?;
Ok(toml::from_str(&content)?)
}