| Crates.io | argrust |
| lib.rs | argrust |
| version | 0.1.0 |
| created_at | 2024-05-08 14:48:54.922601+00 |
| updated_at | 2024-05-08 14:48:54.922601+00 |
| description | Argrust - Simple with Complex features |
| homepage | |
| repository | https://github.com/d33pster/argrust |
| max_upload_size | |
| id | 1233871 |
| size | 34,302 |
Argrust is a simple argument parser that can perform Complicated tasks.
can be installed globally using:
cargo install argrust
or, can be installed just for your project:
cargo add argrust
use argrust::{Arguments, ArgumentDescription, FetchTypes};
Code Description:
Arguments: This is a struct for storing all kinds of info about arguments.
pub struct Arguments {
gotargs: Vec<String>,
allargs: Vec<String>,
arguments: Vec<String>,
errors: Vec<String>,
data: Vec<ArgumentDescription>,
used: Vec<String>,
}
gotargs and are defined in allargs.ArgumentDescription. We will come to that soon. For now, just understand that it will store data about the argument if provided.ArgumentDescription: This is a struct for describing the arguments. While it is optional to provide data about arguments, A shorter counterpart for the argument is manadatory.
pub struct ArgumentDescription {
name: String,
description: String,
shorter_counterpart: String,
}
--abc is the main argument and -a is a shorter counterpart. -> Mandatory.FetchTypes: This is an enum for Fetching values of arguments.
pub enum FetchTypes {
Fetch(usize),
TillLast,
TillNext,
}
Fetch(usize): This can be used with the .fetch() method where you need to specify how many values u are expecting. Suppose there are two arguments -a and -b, and it is passed as -
some_program -a 1 2 -b 34 56
Then, to fetch the values 1 and 2 after -a, you can specify that you are expecting Fetch(2). Similarly to fetch 34 and 56 you can use TillLast to fetch all the arguments till the last of the string. Or if you are not sure, just use Fetch(2).
Arguments can be defined using the following way:
let mut args = Arguments::new(std::env::args().skip(1).collect);
The line std::env::args().skip(1).collect() returns a list of arguments passed to the program except the first argument which is the filename.
To add arguments:
let description_argument1 = ArgumentsDescription::new()
.name("argument1") // this is optional
.description("this is argument 1") // this is optional
.short("-a"); // this is mandatory
args.add("--arg", description_argument1);
To parse the arguments:
args.analyse(); // this will fill the Arguments.arguments if any
// argument is received that is defined by you
To check if an argument is received:
// suppose the argument -a was received. you can check it by two ways.
if args.ifarg("-a") { // or args.ifarg("--arg")
// do something
}
// NOTE: the above function will make the above argument as "used".
// Which means the user is already done with it. More Functionalities
// will be added on this later on.
// To avoid marking the argument as used, use:
if args.ifarg_force("-a") {
// do something
}
To fetch values given to an argument:
// suppose the argument was $ some_program -a 1 2 3
// we are expecting 3 values for this.
let values: Vec<String> = args.fetch("-a", FetchTypes::Fetch(3));
// NOTE: if we are only expecting 2 values, then the last value
// will just be discarded.
// if the number of arguments expected is not known at the current time,
// you have two options -> FetchTypes::TillNext or FetchTypes::TillLast
// NOTE: if it is not known if the argument u are fetching for is in the
// middle or at the last, it is better to use FetchTypes::TillNext.
// It will try to find if this argument is in the middle or not.
// If it is in the middle, then it will fetch all the values between the
// argument and the next argument.
// And if it finds out that the argument is at the last, it will auto-rerun
// with FetchTypes::TillLast. Pretty Handy right!
// use this like:
let values: Vec<String> = args.fetch("--arg", FetchTypes::TillNext);
// NOTE: so if there is no next argument for '--arg', it will run again
// with FetchTypes::TillLast
// Suppose the position of the argument is known to be at the last,
// then simple use FetchTypes::TillLast
// This will fetch all the arguments till Last.
let values: Vec<String> = args.fetch("--arg", FetchTypes::TillLast);
To remove an argument from defined arguments:
args.remove("-a"); // or args.remove("--arg")
// while defining let mut args = Arguments::new(...);, make sure
// to add "mut" or else, add() and remove() wont work.
To fetch data about arguments:
// get from defined arguments:
// by number
let some_arg = args.get_arg_by_number(1); // this will return "--arg"
// by index
let some_arg = args.get_arg_by_index(0); // this will also return "--arg"
// get arg description
let some_arg_description = args.get_arg_description("--arg").get();
Let's see a real working code to understand the concept better:
use argrust::{Arguments, ArgumentDescription, FetchTypes};
use std::env;
fn main() {
let mut args = Arguments::new(env::args().skip(1).collect());
args.add("--setup", ArgumentDescription::new().short("-s"));
args.add("--init", ArgumentDescription::new().name("initialize").short("-i"));
args.analyse();
let mut setup_value = String::new();
if args.ifarg("--setup") {
// fetch setup value
setup_value = args.fetch("-s", FetchTypes::TillLast);
// rest of the code.
} else if args.ifarg("-i") {
// init code
}
// NOTE: here, --init and --setup are mutually exclusive
// meaning: they cannot be used together.
// if you dont want that and you want multiple simultaneous args,
// write them individually:
// if args.ifarg("--setup") {
// // fetch setup value
// setup_value = args.fetch("-s", FetchTypes::TillLast);
// // rest of the code.
// }
// if args.ifarg("-i") {
// // init code
// }
}
NOTE: More features are yet to come.
Auto
To test the features, you can either run the following command in a terminal:
argrust --test
NOTE: this will clone the github repo d33pster/argrust will make a new folder named argrust wherever the terminal was opened. Additionally it will install gcl - a rust based cli tool which is an alternative to git clone command. For more info about gcl click [here].
ADDITIONAL NOTE: If argrust is added using cargo add argrust, this feature will not work. Try manual mode or Install using cargo install argrust
Manual
Run the following in a new terminal:
git clone https://github.com/d33pster/argrust.git
cd argrust
cargo test