t_rust_less_lib/service/
config.rs

1use crate::api::StoreConfig;
2use crate::service::ServiceResult;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5use std::fs::{self, File};
6use std::io::{self, Read, Write};
7use std::path::PathBuf;
8
9#[derive(Clone, Debug, Default, Serialize, Deserialize)]
10pub struct Config {
11  pub default_store: Option<String>,
12  pub stores: HashMap<String, StoreConfig>,
13}
14
15pub fn config_file() -> PathBuf {
16  let home_dir = dirs::home_dir().unwrap_or_else(|| PathBuf::from("."));
17  dirs::config_dir()
18    .map(|configs| configs.join("t-rust-less"))
19    .unwrap_or_else(|| home_dir.join(".t-rust-less"))
20    .join("config.toml")
21}
22
23pub fn read_config() -> ServiceResult<Option<Config>> {
24  let config_file = config_file();
25  match File::open(config_file) {
26    Ok(mut index_file) => {
27      let mut content = String::new();
28
29      index_file.read_to_string(&mut content)?;
30
31      Ok(Some(toml::from_str::<Config>(&content)?))
32    }
33    Err(ref err) if err.kind() == io::ErrorKind::NotFound => Ok(None),
34    Err(err) => Err(err.into()),
35  }
36}
37
38pub fn write_config(config: &Config) -> io::Result<()> {
39  let content = toml::to_string_pretty(config).unwrap();
40  let config_file = config_file();
41
42  fs::create_dir_all(config_file.parent().unwrap())?;
43
44  let mut file = File::create(&config_file)?;
45
46  file.write_all(content.as_bytes())?;
47
48  Ok(())
49}