From f1a89c8d1bc074b9eee5bf8f66fa14523cfcd202 Mon Sep 17 00:00:00 2001 From: ZHU Yuhao Date: Tue, 24 Feb 2026 21:03:10 +0100 Subject: [PATCH 1/2] Add argmojo --- recipes/argmojo/README.md | 282 ++++++++++++++++++++++++++++++++++++ recipes/argmojo/argmojo.jpg | Bin 0 -> 37740 bytes recipes/argmojo/recipe.yaml | 37 +++++ 3 files changed, 319 insertions(+) create mode 100644 recipes/argmojo/README.md create mode 100644 recipes/argmojo/argmojo.jpg create mode 100644 recipes/argmojo/recipe.yaml diff --git a/recipes/argmojo/README.md b/recipes/argmojo/README.md new file mode 100644 index 00000000..8e276e61 --- /dev/null +++ b/recipes/argmojo/README.md @@ -0,0 +1,282 @@ +# ArgMojo + +![icon](argmojo.jpg) + +A command-line argument parser library for [Mojo](https://www.modular.com/mojo). + +> **A**rguments +> **R**esolved and +> **G**rouped into +> **M**eaningful +> **O**ptions and +> **J**oined +> **O**bjects + +## Overview + +ArgMojo provides a builder-pattern API for defining and parsing command-line arguments in Mojo. It currently supports: + +- **Long options**: `--verbose`, `--output file.txt`, `--output=file.txt` +- **Short options**: `-v`, `-o file.txt` +- **Boolean flags**: options that take no value +- **Positional arguments**: matched by position +- **Default values**: fallback when an argument is not provided +- **Required arguments**: validation that mandatory args are present +- **Auto-generated help**: `--help` / `-h` (no need to implement manually) +- **Version display**: `--version` / `-V` (also auto-generated) +- **`--` stop marker**: everything after `--` is treated as positional +- **Short flag merging**: `-abc` expands to `-a -b -c` +- **Attached short values**: `-ofile.txt` means `-o file.txt` +- **Choices validation**: restrict values to a set (e.g., `json`, `csv`, `table`) +- **Metavar**: custom display name for values in help text +- **Hidden arguments**: exclude internal args from `--help` output +- **Count flags**: `-vvv` → `get_count("verbose") == 3` +- **Positional arg count validation**: reject extra positional args +- **Negatable flags**: `--color` / `--no-color` paired flags with `.negatable()` +- **Mutually exclusive groups**: prevent conflicting flags (e.g., `--json` vs `--yaml`) +- **Required-together groups**: enforce that related flags are provided together (e.g., `--username` + `--password`) +- **Long option prefix matching**: allow abbreviated options (e.g., `--verb` → `--verbose`). If the prefix is ambiguous (e.g., `--ver` could match both `--verbose` and `--version`), an error is raised. + +--- + +I created this project to support my experiments with a CLI-based Chinese character search engine in Mojo, as well as a CLI-based calculator for [DeciMojo](https://github.com/forfudan/decimojo). It is inspired by Python's `argparse`, Rust's `clap`, Go's `cobra`, and other popular argument parsing libraries, but designed to fit Mojo's unique features and constraints. + +My goal is to provide a Mojo-idiomatic argument parsing library that can be easily adopted by the growing Mojo community for their CLI applications. **Before Mojo v1.0** (which means it gets stable), my focus is on building core features and ensuring correctness. "Core features" refer to those who appear in `argparse`/`clap`/`cobra` and are commonly used in CLI apps. "Correctness" means that the library should handle edge cases properly, provide clear error messages, and have good test coverage. Some fancy features will depend on my time and interest. + +## Installation + +ArgMojo requires Mojo == 0.26.1 and uses [pixi](https://pixi.sh) for environment management. + +```bash +git clone https://github.com/forfudan/argmojo.git +cd argmojo +pixi install +``` + +I make the Mojo version strictly 0.26.1 because that's the version I developed and tested on, and Mojo is rapidly evolving. Based on my experience, the library will not work every time there's a new Mojo release. + +## Quick Start + +Here is a simple example of how to use ArgMojo in a Mojo program. The full example can be found in `examples/demo.mojo`. + +```mojo +from argmojo import Arg, Command + + +fn main() raises: + var cmd = Command("demo", "A CJK-aware text search tool that supports Pinyin and Yuhao Input Methods (宇浩系列輸入法).", version="0.1.0") + + # Positional arguments + cmd.add_arg(Arg("pattern", help="Search pattern").positional().required()) + cmd.add_arg(Arg("path", help="Search path").positional().default(".")) + + # Boolean flags + cmd.add_arg( + Arg("ling", help="Use Lingming IME for encoding") + .long("ling").short("l").flag() + ) + + # Count flag (verbosity) + cmd.add_arg( + Arg("verbose", help="Increase verbosity (-v, -vv, -vvv)") + .long("verbose").short("v").count() + ) + + # Key-value option with choices and metavar + var formats: List[String] = ["json", "csv", "table"] + cmd.add_arg( + Arg("format", help="Output format") + .long("format").short("f").choices(formats^).default("table") + ) + + # Negatable flag — --color enables, --no-color disables + cmd.add_arg( + Arg("color", help="Enable colored output") + .long("color").flag().negatable() + ) + + # Parse and use + var result = cmd.parse() + print("pattern:", result.get_string("pattern")) + print("verbose:", result.get_count("verbose")) + print("format: ", result.get_string("format")) + print("color: ", result.get_flag("color")) +``` + +## Usage Examples + +For detailed explanations and more examples of every feature, see the **[User Manual](docs/user_manual.md)**. + +Build the demo binary first, then try the examples below: + +```bash +pixi run build_demo +``` + +### Basic usage — positional args and flags + +```bash +./demo "nihao" ./src --ling +``` + +### Short options and default values + +The second positional arg (`path`) defaults to `"."` when omitted: + +```bash +./demo "zhongguo" -l +``` + +### Help and version + +```bash +./demo --help +./demo --version +``` + +### Merged short flags + +Multiple short flags can be combined in a single `-` token. For example, `-liv` is equivalent to `-l -i -v`: + +```bash +./demo "pattern" ./src -liv +``` + +### Attached short values + +A short option can receive its value without a space: + +```bash +./demo "pattern" -d3 # same as -d 3 +./demo "pattern" -ftable # same as -f table +``` + +### Count flags — verbosity + +Use `-v` multiple times (merged or repeated) to increase verbosity: + +```bash +./demo "pattern" -v # verbose = 1 +./demo "pattern" -vvv # verbose = 3 +./demo "pattern" -v --verbose # verbose = 2 (short + long) +``` + +### Choices validation + +The `--format` option only accepts `json`, `csv`, or `table`: + +```bash +./demo "pattern" --format json # OK +./demo "pattern" --format xml # Error: Invalid value 'xml' for 'format'. Valid choices: json, csv, table +``` + +### Negatable flags + +A negatable flag pairs `--X` (sets `True`) with `--no-X` (sets `False`) automatically: + +```bash +./demo "pattern" --color # color = True +./demo "pattern" --no-color # color = False +./demo "pattern" # color = False (default) +``` + +### Mutually exclusive groups + +`--json` and `--yaml` are mutually exclusive — using both is an error: + +```bash +./demo "pattern" --json # OK +./demo "pattern" --yaml # OK +./demo "pattern" --json --yaml # Error: Arguments are mutually exclusive: '--json', '--yaml' +``` + +### `--` stop marker + +Everything after `--` is treated as a positional argument, even if it starts with `-`: + +```bash +./demo --ling -- "--pattern-with-dashes" ./src +``` + +### Hidden arguments + +Some arguments are excluded from `--help` but still work at the command line (useful for debug flags): + +```bash +./demo "pattern" --debug-index # Works, but not shown in --help +``` + +### Required-together groups + +`--username` and `--password` must be provided together — using one without the other is an error: + +```bash +./demo "pattern" --username admin --password secret # OK +./demo "pattern" # OK (neither is provided) +./demo "pattern" --username admin # Error: '--password' required when '--username' is provided +``` + +### A mock example showing how features work together + +```bash +./demo yes ./src --verbo --color -li -d 3 --no-color --usern zhu --pas 12345 +``` + +This will be parsed as: + +```bash +=== Parsed Arguments === + pattern: yes + path: ./src + -l, --ling True + -i, --ignore-case True + -v, --verbose 1 + -d, --max-depth 3 + -f, --format table + --color False + --json False + --yaml False + -u, --username zhu + -p, --password 12345 +``` + +## Development + +```bash +# Format code +pixi run format + +# Build package +pixi run package + +# Run tests +pixi run test + +# Clean build artifacts +pixi run clean +``` + +## Project Structure + +```txt +argmojo/ +├── docs/ # Documentation +│ ├── user_manual.md # User manual with detailed examples +│ └── argmojo_overall_planning.md +├── src/ +│ └── argmojo/ # Main package +│ ├── __init__.mojo # Package exports +│ ├── arg.mojo # Arg struct (argument definition) +│ ├── command.mojo # Command struct (parsing logic) +│ └── result.mojo # ParseResult struct (parsed values) +├── tests/ +│ └── test_argmojo.mojo # Tests +├── pixi.toml # pixi configuration +├── .gitignore +├── LICENSE +└── README.md +``` + +## License + +This project is licensed under the Apache License 2.0. See [LICENSE](LICENSE) for details. diff --git a/recipes/argmojo/argmojo.jpg b/recipes/argmojo/argmojo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93dc8d3f14d1296f07474165b45c595626604d8e GIT binary patch literal 37740 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 Date: Wed, 25 Feb 2026 17:37:18 +0100 Subject: [PATCH 2/2] Update image name --- recipes/argmojo/README.md | 2 +- recipes/argmojo/{argmojo.jpg => image.jpeg} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename recipes/argmojo/{argmojo.jpg => image.jpeg} (100%) diff --git a/recipes/argmojo/README.md b/recipes/argmojo/README.md index 8e276e61..07ca1420 100644 --- a/recipes/argmojo/README.md +++ b/recipes/argmojo/README.md @@ -1,6 +1,6 @@ # ArgMojo -![icon](argmojo.jpg) +![icon](image.jpeg) A command-line argument parser library for [Mojo](https://www.modular.com/mojo). diff --git a/recipes/argmojo/argmojo.jpg b/recipes/argmojo/image.jpeg similarity index 100% rename from recipes/argmojo/argmojo.jpg rename to recipes/argmojo/image.jpeg