Was ist Clap und warum wird es benötigt?
In der Welt der Systemprogrammierung hat sich Rust als eine Sprache etabliert, die die Leistung von C/C++ mit Speichersicherheit kombiniert. Bei der Erstellung von Konsolen-Dienstprogrammen stehen Entwickler jedoch oft vor der Routineaufgabe des Parsens von Befehlszeilenargumenten. Die Bibliothek Clap (Command Line Argument Parser) ist das beliebteste und funktionsreichste CLI-Framework für Rust, das die gesamte Arbeit der Verarbeitung von Flags, Optionen und Unterbefehlen übernimmt.
Clap ermöglicht:
- Automatische Generierung von Hilfe (
--help) und Version (--version); - Verarbeitung von Positionsargumenten, benannten Optionen und Flags;
- Erstellung von verschachtelten Unterbefehlen (wie in
gitodercargo); - Validierung von Datentypen und Überprüfung der Pflichtangabe von Argumenten;
- Arbeit mit Autovervollständigung für die Shells Bash, Zsh, Fish und PowerShell.
Dank des leistungsstarken derive-Makros und der deklarativen API reduziert Clap den Codeumfang im Vergleich zum manuellen Parsen um das 5- bis 10-fache. Die Bibliothek unterstützt sowohl einfache Dienstprogramme als auch komplexe Schnittstellen mit Dutzenden von Optionen.
Installation von Clap in einem Rust-Projekt
Fügen Sie die Abhängigkeit in Cargo.toml hinzu:
[dependencies]clap = { version = "4.5", features = ["derive"] }Das Flag features = ["derive"] aktiviert die Unterstützung für Makros – dies ist die empfohlene Methode für die meisten Projekte. Für minimalistische Dienstprogramme kann nur die Builder-API (ohne derive) verwendet werden.
Beispiel 1: Einfachster Parser mit dem derive-Makro
Erstellen wir ein Dienstprogramm, das einen Benutzernamen und ein optionales Begrüßungsflag akzeptiert:
use clap::Parser;
#[derive(Parser)]#[command(name = "greet")]#[command(about = "Einfache Begrüßung", long_about = None)]struct Cli { /// Benutzername name: String,
/// Begrüßung in Großbuchstaben ausgeben #[arg(short, long)] uppercase: bool,}
fn main() { let cli = Cli::parse();
let greeting = format!("Hallo, {}!", cli.name); if cli.uppercase { println!("{}", greeting.to_uppercase()); } else { println!("{}", greeting); }}Starten Sie das Programm:
$ cargo run -- WeltHallo, Welt!
$ cargo run -- Welt --uppercaseHALLO, WELT!
$ cargo run -- --help# Automatisch generierte HilfeBeispiel 2: Optionen mit Typen und Standardwerten
Clap konvertiert Zeichenketten automatisch in die erforderlichen Typen (Zahlen, Aufzählungen, Daten). Fügen wir eine Option zur Angabe der Wiederholungsanzahl hinzu:
use clap::Parser;
#[derive(Parser)]#[command(name = "repeat")]struct Cli { /// Text zum Wiederholen text: String,
/// Anzahl der Wiederholungen (Standard: 1) #[arg(short, long, default_value_t = 1)] count: u32,}
fn main() { let cli = Cli::parse(); for _ in 0..cli.count { println!("{}", cli.text); }}Jetzt können Sie ausführen:
$ cargo run -- "Rust" -c 3RustRustRustBeispiel 3: Unterbefehle (Subcommands) – wie in Git
Erstellen wir ein Mini-Dienstprogramm zur Aufgabenverwaltung (Todo-Liste) mit den Befehlen add, list und done:
use clap::{Parser, Subcommand};
#[derive(Parser)]#[command(name = "todo")]#[command(about = "Aufgabenverwaltung")]struct Cli { #[command(subcommand)] command: Commands,}
#[derive(Subcommand)]enum Commands { /// Neue Aufgabe hinzufügen Add { /// Aufgabentext task: String, }, /// Alle Aufgaben anzeigen List, /// Aufgabe als erledigt markieren Done { /// Aufgaben-ID id: u32, },}
fn main() { let cli = Cli::parse();
match &cli.comman Auch in der Bibliothek
Jasypt Java: Vollständige Anleitung mit Beispielen
WebSocket-Bibliothek Swift: Starscream für iOS/macOS
Geolokalisierung und Karten in PHP: Überblick über Bibliotheken und Werkzeuge
Elasticsearch REST-Client für Kotlin: Leitfaden zur Verwendung
Aufgabenwarteschlangen in Swift: GCD, OperationQueue und Swift Concurrency