أطر CLI للغة Rust: أدوات قوية لإنشاء تطبيقات وحدة التحكم
Rust هي لغة برمجة أنظمة تكتسب شعبية بفضل أدائها العالي وأمانها وإمكانياتها الحديثة. أحد أكثر استخدامات Rust شيوعًا هو إنشاء أدوات سطر الأوامر (CLI). من ripgrep إلى bat و fd - العديد من الأدوات المعروفة مكتوبة بلغة Rust. في هذه المقالة، سنستعرض أطر CLI الرئيسية للغة Rust التي ستساعدك على تطوير تطبيقات وحدة التحكم الخاصة بك بسرعة وجودة عالية.
لماذا تختار Rust لتطوير CLI؟
تقدم Rust العديد من المزايا الرئيسية لتطوير CLI:
- السرعة العالية - الكود المُجمّع يعمل بأقل تكاليف إضافية.
- أمان الذاكرة - نظام الملكية (ownership) يمنع تسرب البيانات وسباقات البيانات.
- التوافق عبر المنصات - قاعدة كود واحدة تعمل على Windows و macOS و Linux.
- النظام البيئي - مجموعة غنية من المكتبات لتحليل الوسائط، الإخراج الملون، العمل مع ملفات التكوين.
أطر CLI الرئيسية للغة Rust
1. Clap (Command Line Argument Parser)
Clap هو الإطار الأكثر شهرة ووظيفية لتحليل وسائط سطر الأوامر في Rust. يدعم التوليد التلقائي للمساعدة، التلميحات، التحقق من الصحة، الأوامر الفرعية، وغير ذلك الكثير.
use clap::{Parser, Subcommand};
#[derive(Parser)]#[command(name = "git")]#[command(about = "A fictional version of git", long_about = None)]struct Cli { #[command(subcommand)] command: Commands,}
#[derive(Subcommand)]enum Commands { /// Clone a repository Clone { /// URL of the repository url: String, }, /// Push changes Push { /// Remote name remote: String, /// Branch name branch: String, },}
fn main() { let cli = Cli::parse(); match &cli.command { Commands::Clone { url } => println!("Cloning from {}", url), Commands::Push { remote, branch } => println!("Pushing to {} branch {}", remote, branch), }}يوفر Clap طريقتين: تصريحية (عبر derive-macros) ووظيفية (عبر Builder API). لمعظم المشاريع، يُوصى باستخدام نهج derive - فهو أقصر وأكثر قابلية للقراءة.
2. StructOpt
StructOpt هو طبقة فوقية فوق Clap تسمح بتعريف الوسائط عبر الهياكل. بدءًا من الإصدار 3.0، قام Clap بدمج وظائف StructOpt مباشرة، لذلك يُعتبر StructOpt الآن قديمًا. ومع ذلك، لا تزال العديد من المشاريع القديمة تستخدمه.
use structopt::StructOpt;
#[derive(StructOpt)]struct Cli { #[structopt(short = 'n', long = "name")] name: String, #[structopt(short = 'c', long = "count", default_value = "1")] count: u32,}
fn main() { let args = Cli::from_args(); for _ in 0..args.count { println!("Hello, {}!", args.name); }}هام: للمشاريع الجديدة، استخدم Clap مع derive-macros - هذا هو البديل الحديث والمدعوم.
3. Argh
Argh هو إطار خفيف وسريع يركز على البساطة. لا يتطلب تبعيات إضافية (بخلاف نفسه) ويتم تجميعه بسرعة كبيرة. مثالي للأدوات الصغيرة.
use argh::FromArgs;
#[derive(FromArgs)]/// A simple greeting toolstruct Greeting { /// name to greet #[argh(option, short = 'n')] name: String,
/// number of times to greet #[argh(option, short = 'c', default = "1")] count: u32,}
fn main() { let greeting: Greeting = argh::from_env(); for _ in 0..greeting.count { println!("Hello, {}!", greet