Rust
clap tanımı
clap crate'i ile CLI temelini öğrenirsin.
clap tanımı
clap, Rust'ın en yaygın komut satırı argüman ayrıştırıcısıdır. Bir struct tanımlarsın; clap argümanları okur, türlerine çevirir, eksik ya da hatalı girdide açıklayıcı hata ve otomatik --help üretir:
// Cargo.toml: clap = { version = "4", features = ["derive"] }
use clap::Parser;
#[derive(Parser)]
struct Args {
#[arg(long)]
ad: String,
}
fn main() {
let args = Args::parse();
println!("Merhaba {}", args.ad);
}
// $ selam --ad Ece → Merhaba Ece
Alıştırma ortamında dış crate olmadığı için clap'in arka planda yaptığını elle yazacağız; bu, kütüphanenin ne kadar iş kazandırdığını da gösterir.
Elle ayrıştırma
Bir bayrağın değerini bulmak için argümanlar arasında adı aranır ve sonraki eleman alınır:
struct Args {
ad: String,
}
fn ayristir(args: &[&str]) -> Result<Args, String> {
let i = args.iter().position(|a| *a == "--ad").ok_or("--ad gerekli")?;
let ad = args.get(i + 1).ok_or("--ad için değer eksik")?;
Ok(Args { ad: ad.to_string() })
}
ok_or, Option'ı hata mesajlı bir Result'a çevirir.
Uygulama Bayrak oku
Yukarıdaki Args ve ayristir kodunu yaz. ["selam", "--ad", "Ece"] için Merhaba Ece, ["selam"] için hata mesajını hata: ... biçiminde yazdır.
Örnek çözümü göster
struct Args {
ad: String,
}
fn ayristir(args: &[&str]) -> Result<Args, String> {
let i = args.iter().position(|a| *a == "--ad").ok_or("--ad gerekli")?;
let ad = args.get(i + 1).ok_or("--ad için değer eksik")?;
Ok(Args { ad: ad.to_string() })
}
fn main() {
for girdi in [vec!["selam", "--ad", "Ece"], vec!["selam"]] {
match ayristir(&girdi) {
Ok(a) => println!("Merhaba {}", a.ad),
Err(e) => println!("hata: {}", e),
}
}
}
Kendini test et
-
<code>Args::parse()</code> zorunlu <code>--ad</code> verilmezse ne yapar?
- None döndürür
- Hata mesajı ve kullanım bilgisi yazıp programı sonlandırır
- Boş metin kullanır
- Panic verir
Cevabı göster
Hata mesajı ve kullanım bilgisi yazıp programı sonlandırır — parse hatada çıkar; hatayı kendin ele almak istersen try_parse bir Result döndürür.
-
Ayrıştırıcı trait'i
#[derive(____)]
struct Args {
#[arg(long)]
ad: String,
}
Cevabı göster
#[derive(Parser)]
struct Args {
#[arg(long)]
ad: String,
}
-
Komut satırı ve sonuç
- selam --ad Ece
- Merhaba Ece
- selam
- Hata: --ad gerekli
- selam --ad
- Hata: değer eksik
- selam --help
- Otomatik yardım
Sıradaki ders: Derive makrosu