9 releases (stable)

2.1.0 Jan 2, 2025
2.0.0 Jan 1, 2025
1.0.3 Dec 31, 2024
1.0.1 Nov 26, 2024
0.1.2 Aug 28, 2024

#348 in Command-line interface

Download history 14/week @ 2024-09-24 2/week @ 2024-10-01 3/week @ 2024-10-08 6/week @ 2024-10-15 1/week @ 2024-10-29 4/week @ 2024-11-05 5/week @ 2024-11-19 140/week @ 2024-11-26 6/week @ 2024-12-10 37/week @ 2024-12-24 505/week @ 2024-12-31 13/week @ 2025-01-07

555 downloads per month
Used in refold

MIT AND BSD-2-Clause

34KB
772 lines

Declarative macro commandline parser (inspired by argwerk).

argtea attempts to reduce abstraction and maximize flexibility.

Comparison to argwerk

argtea argwerk
--flag=value syntax
-sw 80 <=> -s -w 80 syntax
-Wall <=> -W all syntax
OsString argument support
Customizable help message formatting ✓*
Help message generation ✓*

[*] At runtime

Example project

use argtea::{argtea_impl, simple_format};

#[derive(Debug)]
pub struct Arguments {
    output_path: String,
    files: Vec<String>,
}

fn main() -> Result<(), String> {
    let args = Arguments::parse()?;

    println!("input files: {:?}", args.files);
    println!("output file: {:?}", args.output_path);

    Ok(())
}

argtea_impl! {
    {
        /// Displays this help message.
        ("--help" | "-h") => {
            eprintln!("{}", Self::HELP);

            std::process::exit(0);
        }

        /// Sets the output file path.
        (flag @ "--output" | "-o", output_path) => {
            let Some(output_path) = output_path else {
                return Err(format!("Expected path after `{flag}`"));
            };

            output_path_ = Some(output_path);
        }

        /// Adds a file as an input.
        ///
        /// To input a file that starts with a `-`, prefix it with a `./`
        (file) => {
            if file.starts_with("-") {
                return Err(format!("invalid flag `{file}`"));
            }
            
            files.push(file);
        }
    }

    impl Arguments {
        const HELP: &'static str = simple_format!(
            "argtea_test: a demo argtea project"
            ""
            "Usage: "
            "  `argtea_test [FLAGS] [FILES]`"
            ""
            "Options:"
            docs!()
        );

        pub fn parse() -> Result<Self, String> {
            let mut files = Vec::new();
            let mut output_path_ = None;

            parse!(std::env::args().skip(1));

            Ok(Self {
                files,
                output_path: output_path_.unwrap_or_else(|| "a.out".to_owned())
            })
        }
    }
}

output from argtea_test -h:

argtea_test: a demo argtea project

Usage:
  `argtea_test [FLAGS] [FILES]`

Options:
  --help, -h
    Displays this help message.


  --output, -o <output_path>
    Sets the output file path.


  <file>
    Adds a file as an input.

    To input a file that starts with a `-`, prefix it with a `./`

No runtime deps