⌨️ cli
Command-Line Argument Parser - Rust clap-Inspired
~300 satır
~25 fonksiyon
Auto-Help
📖 Genel Bakış
CLI modülü, Rust'ın clap kütüphanesinden esinlenerek geliştirilmiş modern komut satırı argument parser'ıdır. Otomatik help generation, subcommands, validation ve type-safe parsing sağlar.
🔑 Temel Özellikler
- Flags (boolean options): --verbose, -v
- Options (key-value): --output=file.txt
- Positional arguments: <input> <output>
- Subcommands: git commit, git push
- Automatic --help and --version
- Default values & environment variables
- Value validation & allowed values
- Error handling with clear messages
🚀 Hızlı Başlangıç
içe_aktar cli
fonksiyon ana(args: Vektör[yazı]) yap
// CLI oluştur
değişken app = cli.new("myapp", "1.0.0", "My awesome application")
// Arguments tanımla
app.add_flag("verbose", 'v', "Enable verbose output")
app.add_option("output", 'o', "Output file", varsayılan: "out.txt")
app.add_positional("input", "Input file", gerekli: doğru)
// Parse et (otomatik --help çıkışı)
değişken parsed = app.parse(args)?
// Değerleri kullan
eğer parsed.get_flag("verbose") ise yap
io.println("Verbose mode enabled")
son
değişken input = parsed.get_positional(0)
değişken output = parsed.get_option("output")
io.println("Processing {} -> {}", input, output)
son
💡 Örnek 1: File Converter
içe_aktar cli, fs
fonksiyon ana(args: Vektör[yazı]) yap
değişken app = cli.new("converter", "1.0.0", "File format converter")
// Flags
app.add_flag("overwrite", 'f', "Force overwrite existing files")
app.add_flag("verbose", 'v', "Verbose output")
app.add_flag("quiet", 'q', "Suppress output")
// Options with validation
app.add_option("format", 't', "Target format", yap
varsayılan: "json",
allowed_values: ["json", "xml", "yaml", "toml"]
son)
app.add_option("output", 'o', "Output directory", yap
varsayılan: ".",
env: "OUTPUT_DIR" // Env variable fallback
son)
// Positional
app.add_positional("files", "Input files", yap
gerekli: doğru,
multiple: doğru // Accept multiple files
son)
değişken parsed = app.parse(args)?
// Get values
değişken format = parsed.get_option("format")
değişken output_dir = parsed.get_option("output")
değişken files = parsed.get_positional_all("files")
değişken verbose = parsed.get_flag("verbose")
değişken overwrite = parsed.get_flag("overwrite")
// Process files
her file içinde files için yap
eğer verbose ise yap
io.println("Converting {} to {}...", file, format)
son
değişken output_path = "{}/{}.{}".formatla(output_dir,
fs.stem(file), format)
eğer fs.exists(output_path) ve overwrite değilse yap
io.eprintln("Error: {} exists (use -f to overwrite)", output_path)
devam et
son
// Convert file...
convert_file(file, output_path, format)?
eğer verbose değilse ve parsed.get_flag("quiet") değilse yap
io.println("✓ {}", output_path)
son
son
son
// Output:
// $ converter --help
// converter 1.0.0
// File format converter
//
// USAGE:
// converter [OPTIONS] <files>...
//
// OPTIONS:
// -t, --format <value> Target format [default: json] [possible: json, xml, yaml, toml]
// -o, --output <value> Output directory [default: .] [env: OUTPUT_DIR]
// -f, --overwrite Force overwrite existing files
// -v, --verbose Verbose output
// -q, --quiet Suppress output
// -h, --help Print help
// -V, --version Print version
💡 Örnek 2: Git-Style Subcommands
içe_aktar cli
fonksiyon ana(args: Vektör[yazı]) yap
değişken app = cli.new("git-like", "1.0.0", "Git-style CLI tool")
// Global flags
app.add_flag("verbose", 'v', "Verbose output")
// Subcommands
değişken commit = app.add_subcommand("commit", "Record changes")
commit.add_option("message", 'm', "Commit message", gerekli: doğru)
commit.add_flag("amend", 'a', "Amend previous commit")
commit.add_flag("all", 'A', "Stage all changes")
değişken push = app.add_subcommand("push", "Push to remote")
push.add_option("remote", 'r', "Remote name", varsayılan: "origin")
push.add_option("branch", 'b', "Branch name")
push.add_flag("force", 'f', "Force push")
değişken log = app.add_subcommand("log", "Show commit history")
log.add_option("limit", 'n', "Number of commits", varsayılan: "10")
log.add_flag("oneline", Hiçbir, "One commit per line")
// Parse
değişken parsed = app.parse(args)?
// Handle subcommands
eşle parsed.subcommand() yap
Bazı("commit") => yap
değişken msg = parsed.get_option("message")
değişken amend = parsed.get_flag("amend")
değişken all = parsed.get_flag("all")
eğer all ise yap
io.println("Staging all changes...")
son
eğer amend ise yap
io.println("Amending commit: {}", msg)
değilse yap
io.println("Creating commit: {}", msg)
son
son,
Bazı("push") => yap
değişken remote = parsed.get_option("remote")
değişken branch = parsed.get_option_or("branch", "main")
değişken force = parsed.get_flag("force")
eğer force ise yap
io.println("Force pushing to {}/{}", remote, branch)
değilse yap
io.println("Pushing to {}/{}", remote, branch)
son
son,
Bazı("log") => yap
değişken limit = parsed.get_option("limit").parse_int()?
değişken oneline = parsed.get_flag("oneline")
io.println("Showing last {} commits:", limit)
// Show log...
son,
Hiçbir => yap
io.eprintln("No subcommand provided. Use --help for usage.")
sys.exit(1)
son
son
son
⚙️ Argument Types
// Flag (boolean)
app.add_flag(name: yazı, short: char, help: yazı)
// Option (string value)
app.add_option(name: yazı, short: char, help: yazı, config: OptionConfig)
yapı OptionConfig yap
varsayılan: İsteğe_Bağlı[yazı],
gerekli: mantıksal,
env: İsteğe_Bağlı[yazı],
allowed_values: İsteğe_Bağlı[Vektör[yazı]]
son
// Positional (required arguments)
app.add_positional(name: yazı, help: yazı, config: PositionalConfig)
yapı PositionalConfig yap
gerekli: mantıksal,
multiple: mantıksal // Accept multiple values
son
🔗 İlgili Modüller
sys- Command-line argumentsterminal- Colored outputstring- String parsing