diff options
Diffstat (limited to 'src/commands/mod.rs')
| -rw-r--r-- | src/commands/mod.rs | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..b1c5f51 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,88 @@ +use std::{ + fs, + io::{self,Result,Write}, + path::PathBuf, +}; + +mod sync; + +use crate::{Config,Entry}; +use crate::arguments::*; + +fn save_config(config: &Config, path: &PathBuf) -> Result<()> { + let toml = toml::to_string(config).unwrap(); + fs::write(path.join("configs.toml"), toml)?; + Ok(()) +} + +pub fn modify_command( + config: &mut Config, + args: ModifyArgs, + configs_path: &PathBuf, +) -> Result<()> { + + if config.contains_key(&args.name) { loop { + let mut input = String::new(); + + print!("Entry already exists for {}. Overwrite it? (y/n) ", &args.name); + let _ = io::stdout().flush(); + io::stdin() + .read_line(&mut input) + .expect("Failed to read user input."); + + match input.to_lowercase().trim() { + "y" => break, + "n" => return Ok(()), + _ => { + println!("Try again :)"); + continue; + }, + }; + }} + + let entry = Entry { file: args.file, parent: args.dest }; + config.insert(args.name, entry); + save_config(&config, configs_path)?; + + Ok(()) +} + +pub fn remove_command( + config: &mut Config, + args: RemoveArgs, + configs_path: &PathBuf +) -> Result<()> { + + if !config.contains_key(&args.name) { + panic!("Such an entry does not exist."); + } + config.remove(&args.name); + save_config(&config, configs_path)?; + + Ok(()) +} + +pub fn list_command(config: &Config) { + for (key,entry) in config { + println!(r#""{}" - src: {}, dest: {}"#, key, entry.file.to_str().unwrap(), entry.parent.to_str().unwrap()); + } +} + +pub fn sync_command(config: &Config, args: SyncArgs, configs_path: &PathBuf) { + if args.all { + sync::sync_all(config, configs_path, args.force); + return + } + + for name in &args.names { + let entry = match config.get(name) { + Some(e) => e, + None => { + eprintln!(r#"Entry "{name}" not found."#); + continue; + }, + }; + + sync::sync_config(name, entry, configs_path, &args.force); + } +} |