Files
gamenight/gamenight-cli/src/domain/config.rs

86 lines
2.4 KiB
Rust

use std::{env, fs::{self}, path::{Path, PathBuf}};
use serde::{Deserialize, Serialize};
#[derive(Debug)]
pub struct ConfigError(pub String);
impl From<serde_json::Error> for ConfigError {
fn from(value: serde_json::Error) -> Self {
Self(value.to_string())
}
}
impl From<std::io::Error> for ConfigError {
fn from(value: std::io::Error) -> Self {
Self(value.to_string())
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Instance {
pub name: String,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub token: Option<String>
}
impl Instance {
pub fn new(name: String, url: String) -> Self {
Self {
name,
url,
token: None
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Config {
pub instances: Vec<Instance>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub last_instance: Option<String>,
}
impl Config {
fn config_path() -> PathBuf {
let mut prefix = Path::new(&env::var("HOME").expect("HOME environment variable was not set")).join(".config");
if let Ok(config_home) = env::var("XDG_CONFIG_HOME") {
prefix = config_home.into();
}
prefix.join("gamenight-cli").join("config.json")
}
pub fn new() -> Config {
Config {
instances: vec![],
last_instance: None
}
}
pub fn load() -> Result<Config, ConfigError> {
let config_path = Self::config_path();
if !fs::exists(&config_path)? {
let config_error = ConfigError(format!("Cannot create parent directory for config file: {}", &config_path.display()).to_string());
let _ = fs::create_dir_all(&config_path.parent().ok_or(config_error)?)?;
let config = Config::new();
fs::write(&config_path, serde_json::to_string_pretty(&config)?.as_bytes())?;
Ok(config)
}
else {
let config_string = fs::read_to_string(Self::config_path())?;
Ok(serde_json::from_str(&config_string)?)
}
}
pub fn save(gamenight_configuration: &Config) -> Result<(), ConfigError> {
let config_path = Self::config_path();
fs::write(&config_path, serde_json::to_string_pretty(gamenight_configuration)?.as_bytes())?;
Ok(())
}
}