feat: arguments with clip
This commit is contained in:
parent
09250c59cb
commit
1d3895bd43
6 changed files with 85 additions and 46 deletions
|
@ -7,7 +7,7 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
fern = "0.6.2"
|
fern = "0.6.2"
|
||||||
getopts = "0.2.21"
|
|
||||||
log = "0.4.19"
|
log = "0.4.19"
|
||||||
regex = "1.9.1"
|
regex = "1.9.1"
|
||||||
manifest = { path = "../manifest" }
|
manifest = { path = "../manifest" }
|
||||||
|
clap = { version = "4.3.12", features = ["derive"] }
|
||||||
|
|
|
@ -1,9 +1,63 @@
|
||||||
use crate::package::identifier::PackageIdentifier;
|
use crate::package::identifier::PackageIdentifier;
|
||||||
use crate::prelude::Arguments;
|
use clap::{Parser, Subcommand};
|
||||||
|
use log::error;
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[clap(name = "pkgr", version = "0.1.0", author = "")]
|
||||||
|
pub struct Cli {
|
||||||
|
#[command(subcommand)]
|
||||||
|
pub command: Command,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subcommand, Debug)]
|
||||||
pub enum Command {
|
pub enum Command {
|
||||||
Install(Arguments, PackageIdentifier), // install a package from a remote source
|
/// Install a package
|
||||||
Remove(PackageIdentifier), // remove a package from the local source
|
Install {
|
||||||
List, // list all packages in the local source
|
#[arg(short, long, default_value_t = false)]
|
||||||
|
build: bool,
|
||||||
|
package_identifier: PackageIdentifier,
|
||||||
|
},
|
||||||
|
/// Remove a package from the system
|
||||||
|
Remove {
|
||||||
|
package_identifier: PackageIdentifier,
|
||||||
|
},
|
||||||
|
/// List packages
|
||||||
|
List {
|
||||||
|
/// List installed packages
|
||||||
|
#[arg(short, long, default_value_t = true)]
|
||||||
|
installed: bool,
|
||||||
|
},
|
||||||
|
/// Update packages on the system
|
||||||
Update,
|
Update,
|
||||||
}
|
#[command(hide = true)]
|
||||||
|
None,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Command {
|
||||||
|
pub fn execute(&self) {
|
||||||
|
match self {
|
||||||
|
Command::Install {
|
||||||
|
build,
|
||||||
|
package_identifier,
|
||||||
|
} => {
|
||||||
|
if *build {
|
||||||
|
error!("Build is not yet implemented.");
|
||||||
|
} else {
|
||||||
|
error!("Install is not yet implemented.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Command::Remove { package_identifier } => {
|
||||||
|
error!("Remove is not yet implemented.");
|
||||||
|
}
|
||||||
|
Command::List { installed } => {
|
||||||
|
error!("List is not yet implemented.");
|
||||||
|
}
|
||||||
|
Command::Update => {
|
||||||
|
error!("Update is not yet implemented.");
|
||||||
|
}
|
||||||
|
Command::None => {
|
||||||
|
error!("No command was specified.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,45 +1,19 @@
|
||||||
|
use clap::Parser;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use getopts::Options;
|
use crate::commands::{Cli, Command};
|
||||||
use log::{info, SetLoggerError};
|
use log::{info, SetLoggerError};
|
||||||
|
|
||||||
mod prelude;
|
|
||||||
mod commands;
|
mod commands;
|
||||||
mod package;
|
mod package;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
setup_logger()
|
setup_logger().expect("Unable to setup logger.");
|
||||||
.expect("Unable to setup logger.");
|
|
||||||
|
|
||||||
let args: Vec<String> = env::args().collect();
|
let c = Cli::parse();
|
||||||
let program = args[0].clone();
|
info!("Command: {:?}", c);
|
||||||
|
|
||||||
let mut opts = Options::new();
|
|
||||||
opts.optflag("h", "help", "Show help message.");
|
|
||||||
let matches = opts.parse(&args[1..]).unwrap_or_else(|e| panic!("{}", e.to_string()));
|
|
||||||
|
|
||||||
if matches.opt_present("h") {
|
|
||||||
print_usage(&program, opts);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
let command = if !matches.free.is_empty() {
|
|
||||||
matches.free[0].clone()
|
|
||||||
} else {
|
|
||||||
print_usage(&program, opts);
|
|
||||||
exit(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
info!("Identifier: {}", package::identifier::PackageIdentifier::from_str(&command).unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
fn print_usage(program: &str, opts: Options) {
|
|
||||||
let mut brief = format!("Usage: {} <COMMAND> [options]\n\n", program);
|
|
||||||
brief += &*format!("Commands: grab \n");
|
|
||||||
brief += &*format!(" remove\n");
|
|
||||||
print!("{}", opts.usage(&brief.trim_end()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_logger() -> Result<(), SetLoggerError> {
|
fn setup_logger() -> Result<(), SetLoggerError> {
|
||||||
|
@ -57,4 +31,4 @@ fn setup_logger() -> Result<(), SetLoggerError> {
|
||||||
.level(log::LevelFilter::Info)
|
.level(log::LevelFilter::Info)
|
||||||
.chain(std::io::stdout())
|
.chain(std::io::stdout())
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
use std::error::Error;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum PackageIdentifierError {
|
pub enum PackageIdentifierError {
|
||||||
InvalidPackageLocator(String),
|
InvalidPackageLocator(String),
|
||||||
InvalidURI(String),
|
InvalidURI(String),
|
||||||
|
@ -11,13 +12,17 @@ pub enum PackageIdentifierError {
|
||||||
impl std::fmt::Display for PackageIdentifierError {
|
impl std::fmt::Display for PackageIdentifierError {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
PackageIdentifierError::InvalidPackageLocator(s) => write!(f, "Invalid package locator: {}", s),
|
PackageIdentifierError::InvalidPackageLocator(s) => {
|
||||||
|
write!(f, "Invalid package locator: {}", s)
|
||||||
|
}
|
||||||
PackageIdentifierError::InvalidURI(s) => write!(f, "Invalid URI: {}", s),
|
PackageIdentifierError::InvalidURI(s) => write!(f, "Invalid URI: {}", s),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
impl Error for PackageIdentifierError {}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub enum PackageIdentifier {
|
pub enum PackageIdentifier {
|
||||||
PackageLocator(PackageLocator),
|
PackageLocator(PackageLocator),
|
||||||
URI(String),
|
URI(String),
|
||||||
|
@ -32,7 +37,7 @@ impl std::fmt::Display for PackageIdentifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct PackageLocator {
|
pub struct PackageLocator {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub version: Option<u32>,
|
pub version: Option<u32>,
|
||||||
|
@ -102,7 +107,14 @@ impl FromStr for PackageLocator {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(caps) = tags_re.captures(s) {
|
if let Some(caps) = tags_re.captures(s) {
|
||||||
tags = Some(caps.get(1).unwrap().as_str().split(",").map(|s| s.to_string()).collect());
|
tags = Some(
|
||||||
|
caps.get(1)
|
||||||
|
.unwrap()
|
||||||
|
.as_str()
|
||||||
|
.split(",")
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.collect(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(PackageLocator {
|
Ok(PackageLocator {
|
||||||
|
@ -111,4 +123,4 @@ impl FromStr for PackageLocator {
|
||||||
tags,
|
tags,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
pub mod identifier;
|
pub mod identifier;
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
pub struct Arguments(Vec<String>);
|
|
Loading…
Reference in a new issue