pub mod arguments;
pub mod config;
pub mod formatting;
pub mod types;
use crate::{arguments::Arguments, config::Config, formatting::format::format_ls};
use std::{env, fs, path::Path, process::exit};
use toml;
fn main() -> std::io::Result<()> {
let config_file: String = format!(
"{}/.config/lse/config.toml",
env::var("HOME").expect("HOME environment variable is not set")
);
let contents = match fs::read_to_string(&config_file) {
Ok(c) => c,
Err(_) => {
let _ = config::generate_config(format!(
"{}/.config/lse/config.toml",
env::var("HOME").expect("HOME environment variable is not set")
));
exit(1);
}
};
let config: Config = match toml::from_str(&contents) {
Ok(d) => d,
Err(e) => {
eprintln!("Unable to load config from {}\n{}", config_file, e);
exit(1);
}
};
let possible_args = arguments::create_arg();
let mut args: Vec<&Arguments> = Vec::new();
let mut path: Option<String> = Some(".".to_string());
for arg in env::args() {
let possible_path = Path::new(&arg);
if possible_path.exists() && possible_path.is_dir() {
path = Some(possible_path.to_string_lossy().to_string());
} else {
for possible_arg in &possible_args {
if let Some(ref short) = possible_arg.short {
if arg == *short && !args.contains(&possible_arg.get_arg_type()) {
args.push(possible_arg.get_arg_type());
}
}
if let Some(ref long) = possible_arg.long {
if arg == *long && !args.contains(&possible_arg.get_arg_type()) {
args.push(possible_arg.get_arg_type());
}
}
}
}
}
format_ls(config, path.unwrap(), args)
}