You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.1 KiB
Rust

use std::io::{BufRead, BufReader};
use std::process::exit;
use std::path::Path;
use std::fs::File;
#[derive(Clone, Debug)]
pub struct Config {
pub start_uri: String,
pub cmd_text: String,
pub cmd_image: String,
pub cmd_browser: String,
pub cmd_player: String,
pub color_prompt: String,
pub color_selector: String,
pub bookmarks: Vec<String>,
pub verbose: bool,
}
impl Config {
pub fn new() -> Self {
Self {
start_uri: String::from("gopher://gopher.floodgap.com:70"),
cmd_text: String::from("less"),
cmd_image: String::from("display"),
cmd_browser: String::from("firefox"),
cmd_player: String::from("mplayer"),
color_prompt: String::from("1;34"),
color_selector: String::from("1;32"),
bookmarks: Vec::new(),
verbose: false,
}
}
fn parse_line(&mut self, line: &str) {
let trimmed_line = line.trim_start();
let words = trimmed_line.split_whitespace().take(2).collect::<Vec<_>>();
match words[0] {
"start_uri" => self.start_uri = words[1].to_string(),
"cmd_text" => self.cmd_text = words[1].to_string(),
"cmd_browser" => self.cmd_browser = words[1].to_string(),
"cmd_image" => self.cmd_image = words[1].to_string(),
"cmd_player" => self.cmd_player = words[1].to_string(),
"color_prompt" => self.color_prompt = words[1].to_string(),
"color_selector" => self.color_selector = words[1].to_string(),
"verbose" => self.verbose = words[1].parse().unwrap_or_default(),
x if x.starts_with("bookmark") => self.bookmarks.push(words[1].to_string()),
x => {
eprintln!("invalid key in config: {}", x);
exit(1)
}
}
}
pub fn load<P: AsRef<Path>>(&mut self, filename: P) {
let file = match File::open(filename) {
Ok(f) => BufReader::new(f),
Err(_) => {
return;
}
};
file.lines()
.filter_map(|x| x.ok())
.filter(|x| !x.starts_with('#'))
.for_each(|line| self.parse_line(&line))
}
pub fn init(&mut self) {
/* read configs */
self.load("/etc/cgorc"); /* ignore incomplete selectors */
if let Some(dir) = dirs::home_dir() {
self.load(dir.join(".cgorc"));
}
}
}