Code Monkey home page Code Monkey logo

argopt's Introduction

Crates.io Workflow Status

argopt

This crate provides attribute macros for command-line argument parsing.

Usage

Just by adding an attribute #[cmd] to a function, the function is converted to a command line program.

use argopt::cmd;

#[cmd]
fn main(host: String, port: u16) {
    // ...
}

The output is:

$ cargo run
error: The following required arguments were not provided:
    <host>
    <port>

USAGE:
    argopt-test <host> <port>

You can customize the behavior of arguments by annotating them with attributes.

use argopt::cmd;

#[cmd]
fn main(
    #[opt(short = "h", long = "host")]
    host: String,
    #[opt(short, long, default_value = "80")]
    port: u16,
) {
    // ...
}

And you can add help messages by adding doccomments.

use argopt::cmd;

/// Sample program
#[cmd]
fn main(
    /// Host name
    #[opt(short = "h", long = "host")]
    host: String,
    /// Port number
    #[opt(short, long, default_value = "80")]
    port: u16,
) {
    // ...
}

The output is:

argopt-test 0.1.0
Sample program

USAGE:
    simple [OPTIONS] --host <host>

FLAGS:
        --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -h, --host <host>    Host name
    -p, --port <port>    Port number [default: 80]

You can use the same options as structopt.

Subcommands

You can create sub commands by adding the attribute #[subcmd] to functions.

use argopt::{subcmd, cmd_group};
use std::path::PathBuf;

#[subcmd]
fn add(
    #[opt(short)]
    interactive: bool,
    #[opt(short)]
    patch: bool,
    files: Vec<PathBuf>,
) {
    // ...
}

#[subcmd]
fn commit(
    #[opt(short)]
    message: Option<String>,
    #[opt(short)]
    all: bool,
) {
    // ...
}

#[cmd_group(commands = [add, commit])]
fn main() {}

Easy Verbosity Level Handling

There is a feature that allows you to interact with the log crate and handle the verbosity level automatically.

use argopt::cmd;
use log::*;

#[cmd(verbose)]
fn main() {
    error!("This is error");
    warn!("This is warn");
    info!("This is info");
    debug!("This is debug");
    trace!("This is trace");
}

The output is:

$ cargo run
This is error

$ cargo run -- -v
This is error
This is warn

$ cargo run -- -vv
This is error
This is warn
This is info

$ cargo run -- -vvv
This is error
This is warn
This is info
This is debug

$ cargo run -- -vvvv
This is error
This is warn
This is info
This is debug
This is trace

License: MIT

argopt's People

Contributors

tanakh avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.