You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.0 KiB
80 lines
3.0 KiB
/*##############################################################################
|
|
## Author: Shaun Reed ##
|
|
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ##
|
|
## About: Wrapper for StructOpt crate functionality used by kot ##
|
|
## ##
|
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
|
##############################################################################*/
|
|
|
|
use structopt::StructOpt;
|
|
|
|
// =============================================================================
|
|
// STRUCTS
|
|
// =============================================================================
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#[derive(Debug, StructOpt)]
|
|
#[structopt(
|
|
name="kot",
|
|
about="CLI for managing Linux user configurations"
|
|
)]
|
|
pub struct Cli {
|
|
#[structopt(
|
|
help="Local or full path to user configurations to install",
|
|
parse(from_os_str)
|
|
)]
|
|
pub dotfiles_dir: std::path::PathBuf,
|
|
|
|
#[structopt(
|
|
help="The location to attempt installation of user configurations",
|
|
default_value="dry-runs/kapper", // TODO: Remove temp default value after tests
|
|
// env = "HOME", // Default value to env variable $HOME
|
|
name="install-dir",
|
|
short, long,
|
|
parse(from_os_str)
|
|
)]
|
|
pub install_dir: std::path::PathBuf,
|
|
|
|
#[structopt(
|
|
help="The location to store backups for this user",
|
|
default_value="backups/kapper",
|
|
name="backup-dir",
|
|
short, long,
|
|
parse(from_os_str)
|
|
)]
|
|
pub backup_dir: std::path::PathBuf,
|
|
}
|
|
|
|
// =============================================================================
|
|
// IMPLEMENTATION
|
|
// =============================================================================
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// Augment implementation of from_args to limit scope of StructOpt
|
|
// + Also enforces use of Cli::normalize()
|
|
// https://docs.rs/structopt/0.3.23/src/structopt/lib.rs.html#1121-1126
|
|
pub fn from_args() -> Cli {
|
|
let s = Cli::from_clap(&Cli::clap().get_matches());
|
|
s.normalize()
|
|
}
|
|
|
|
impl Cli {
|
|
// Helper function to normalize arguments passed to program
|
|
pub fn normalize(mut self) -> Self {
|
|
// If the path to the dotfiles doesn't exist, exit with error
|
|
if !&self.dotfiles_dir.exists() {
|
|
panic!("Error: Dotfiles configuration at {:?} does not exist", self.dotfiles_dir);
|
|
}
|
|
self.dotfiles_dir = self.dotfiles_dir.canonicalize().unwrap();
|
|
|
|
// If either the install or backup dir don't exist, create them
|
|
std::fs::create_dir_all(&self.install_dir).ok();
|
|
self.install_dir = self.install_dir.canonicalize().unwrap();
|
|
std::fs::create_dir_all(&self.backup_dir).ok();
|
|
self.backup_dir = self.backup_dir.canonicalize().unwrap();
|
|
self
|
|
}
|
|
}
|