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
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"));
|
|
}
|
|
}
|
|
}
|