Compare commits

..

4 commits
v0.4.0 ... main

2 changed files with 27 additions and 14 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "config" name = "config"
version = "0.4.0" version = "0.4.2"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View file

@ -2,6 +2,7 @@ use std::{
env::{ current_dir, var }, env::{ current_dir, var },
error::Error, error::Error,
fs::read_to_string, fs::read_to_string,
io::{ stdout, IsTerminal },
path::PathBuf, path::PathBuf,
process::{ process::{
Command, Command,
@ -21,8 +22,14 @@ fn main() -> Result<(), Box<dyn Error>>{
// get args // get args
let mut args = Arguments::from_env(); let mut args = Arguments::from_env();
// collect args
let flag_help = args.contains(["-h", "--help"]);
let flag_list = args.contains(["-l", "--list"]);
let flag_dir = args.contains(["-d", "--dir"]);
let flag_path = args.contains(["-p", "--path"]);
// handle help flag // handle help flag
if args.contains(["-h", "--help"]) { if flag_help {
help_text(); help_text();
return Ok(()); return Ok(());
} }
@ -50,19 +57,23 @@ fn main() -> Result<(), Box<dyn Error>>{
let mut section: &Map<String, Value> = config; let mut section: &Map<String, Value> = config;
let mut target = args.subcommand().unwrap(); let mut target = args.subcommand().unwrap();
let mut fullname = String::new(); let mut fullname = String::new();
while target.is_some() { if target.is_some() {
let entry = target.unwrap().clone(); loop {
if !fullname.is_empty() { fullname += "."; } let entry = target.as_ref().unwrap();
fullname += &entry; if !fullname.is_empty() { fullname += "."; }
let i_section = section.get(&entry); fullname += entry;
if i_section.is_none() { error::no_section(&entry); } let i_section = section.get(entry);
section = i_section.unwrap().as_table().unwrap(); if i_section.is_none() { error::no_section(&entry); }
section = i_section.unwrap().as_table().unwrap();
target = args.subcommand().unwrap(); let i_target = args.subcommand().unwrap();
if i_target.is_none() { break; }
target = i_target;
}
} }
// handle list flag // handle list flag
if args.contains(["-l", "--list"]) { if flag_list {
for (key, _) in section.iter() { for (key, _) in section.iter() {
println!("{key}"); println!("{key}");
} }
@ -71,9 +82,11 @@ fn main() -> Result<(), Box<dyn Error>>{
if target.is_none() { error::no_args(); } if target.is_none() { error::no_args(); }
let is_terminal = stdout().is_terminal();
let prop_path = section.get("path"); let prop_path = section.get("path");
// handle dir flag // handle dir flag
if args.contains(["-d", "--dir"]) { if flag_dir {
if prop_path.is_none() { if prop_path.is_none() {
error::no_property(&fullname, "path"); error::no_property(&fullname, "path");
} }
@ -90,7 +103,7 @@ fn main() -> Result<(), Box<dyn Error>>{
return Ok(()); return Ok(());
} }
// handle path flag // handle path flag
if args.contains(["-p", "--path"]) { if flag_path || !is_terminal {
if prop_path.is_none() { error::no_property(&fullname, "path"); } if prop_path.is_none() { error::no_property(&fullname, "path"); }
let i_file_path = prop_path.unwrap().as_str().unwrap(); let i_file_path = prop_path.unwrap().as_str().unwrap();
let file_path = if i_file_path.starts_with("~") { i_file_path.replace("~", &home_dir) } else { i_file_path.to_string() }; let file_path = if i_file_path.starts_with("~") { i_file_path.replace("~", &home_dir) } else { i_file_path.to_string() };
@ -155,7 +168,7 @@ fn help_text() {
Valerie Wolfe <sleeplessval@gmail.com> Valerie Wolfe <sleeplessval@gmail.com>
A configuration manager written in Rust. A configuration manager written in Rust.
usage: config [flags] <name> usage: config <name> [flags]
args: args:
<name> The name of the section to configure. <name> The name of the section to configure.