Files
navigate/src/config.rs
T

124 lines
3.6 KiB
Rust

#![allow(dead_code)]
//! handle the config file and bookmarks stored
//! in said config file
use dirs::config_dir;
use std::fs;
use std::io::{Error, Result};
use config_parser::*;
#[derive(Debug, Clone, Default, ConfigParser)]
pub struct Config {
#[nested_config]
pub general: GeneralSettings,
#[nested_config]
pub format: FormatSettings,
#[nested_config]
pub styles: StyleSettings,
}
#[derive(Debug, Clone, Default, ConfigParser)]
pub struct GeneralSettings {
pub show_stack_on_push: bool,
pub show_stack_on_pop: bool,
pub show_books_on_bookmark: bool,
}
#[derive(Debug, Clone, Default, ConfigParser)]
pub struct FormatSettings {
pub stack_separator: String,
pub bookmarks_separator: String,
pub align_separators: bool,
}
#[derive(Debug, Clone, Default, ConfigParser)]
pub struct StyleSettings {
#[style_config]
pub warning_style: String,
#[style_config]
pub error_style: String,
#[style_config]
pub stack_number_style: String,
#[style_config]
pub stack_separator_style: String,
#[style_config]
pub stack_path_style: String,
#[style_config]
pub stack_punct_style: String,
#[style_config]
pub bookmarks_name_style: String,
#[style_config]
pub bookmarks_seperator_style: String,
#[style_config]
pub bookmarks_path_style: String,
#[style_config]
pub bookmarks_punct_style: String,
}
impl Config {
const CONFIG_FILE_NAME: &str = "navigate.conf";
/// generates and populates a new instance of Config
pub fn new(styles_as_ansi_sequences: bool) -> Result<Self> {
let mut config = Config {
general: GeneralSettings {
show_stack_on_push: false,
show_stack_on_pop: false,
show_books_on_bookmark: false,
},
format: FormatSettings {
bookmarks_separator: String::new(),
stack_separator: String::new(),
align_separators: false,
},
styles: StyleSettings {
warning_style: String::new(),
error_style: String::new(),
stack_number_style: String::new(),
stack_separator_style: String::new(),
stack_path_style: String::new(),
stack_punct_style: String::new(),
bookmarks_name_style: String::new(),
bookmarks_seperator_style: String::new(),
bookmarks_path_style: String::new(),
bookmarks_punct_style: String::new(),
},
};
// get configuration directory
let mut conf_file = match config_dir() {
Some(value) => value,
None => {
return Err(Error::other(
"-- failed to retrieve configuration directory",
))
}
};
// expand path to configuration file
conf_file.push(format!("navigate/{}", Self::CONFIG_FILE_NAME));
// parse configuration file and populate config struct
if conf_file.is_file() {
let config_str = match fs::read_to_string(&conf_file) {
Ok(value) => value,
Err(error) => return Err(error),
};
_ = config.parse_from_string(&config_str);
} else {
// TODO: write default configuration
}
if styles_as_ansi_sequences {
config.to_ansi_sequences()?;
}
Ok(config)
}
/// formats and prints config to string
pub fn to_formatted_string(&self) -> Result<String> {
Ok(format!("{:#?}", self))
}
}