imgurs/imgurs-cli/src/config/toml.rs

63 lines
2.0 KiB
Rust
Raw Normal View History

2022-01-24 22:15:55 +00:00
use super::Config;
2022-01-22 21:02:51 +00:00
use colored::Colorize;
use dirs::config_dir;
use log::warn;
2022-01-24 22:15:55 +00:00
use std::{
fs::{create_dir_all, read_to_string, File},
2022-03-10 21:08:01 +00:00
io::{self, Write as _},
2022-01-24 22:15:55 +00:00
path::Path,
};
use toml::from_str as toml_from_str;
2022-01-24 22:15:55 +00:00
2022-07-08 09:54:48 +00:00
/// Configuration file path (in system config directory).
const CONFIG_DIR: &str = "/imgurs/config.toml";
2022-07-08 09:54:48 +00:00
/// Parse configuration file
2022-01-24 22:15:55 +00:00
pub fn parse() -> Config {
2022-07-08 09:54:48 +00:00
// parse config or use default
toml().unwrap_or_else(|err| {
let mut stdout = std::io::stdout();
2022-01-24 22:15:55 +00:00
write!(stdout, "{}", "The configuration file could not be opened. Do you want to create/overwrite with DEFAULT values? (Y/n): ".yellow()).unwrap();
stdout.flush().unwrap();
2022-01-24 22:15:55 +00:00
let mut value = String::new();
io::stdin()
.read_line(&mut value)
.expect("failed to read line");
2022-01-22 21:02:51 +00:00
if value.to_lowercase() != "n\n" {
warn!("Parse toml config error: {err}! Creating config file...");
2022-01-24 22:15:55 +00:00
2022-09-05 19:21:25 +00:00
let default_config = include_str!(concat!("../../config.toml"));
2022-01-24 22:15:55 +00:00
let sys_config_dir = config_dir().expect("find config dir");
let config_dir = format!("{}{CONFIG_DIR}", sys_config_dir.to_string_lossy());
let config_path = Path::new(&config_dir);
2022-01-24 22:15:55 +00:00
let prefix = config_path.parent().unwrap();
create_dir_all(prefix).expect("create config dir");
let mut file_ref = File::create(config_path).expect("create failed");
file_ref
.write_all(default_config.as_bytes())
.expect("failed write default config to file");
toml().expect("parse toml config")
} else {
2022-07-08 09:54:48 +00:00
panic!("Configuration file creation cancelled!")
}
2022-01-24 22:15:55 +00:00
})
}
2022-05-18 18:16:42 +00:00
fn toml() -> anyhow::Result<Config> {
2022-01-22 21:02:51 +00:00
let config_dir = config_dir().unwrap();
let file_dir = format!("{}{CONFIG_DIR}", config_dir.to_string_lossy());
2022-05-18 18:26:29 +00:00
let toml_str = read_to_string(file_dir)?;
let decode = toml_from_str(&toml_str)?;
2022-01-22 21:02:51 +00:00
Ok(decode)
}