مشروع إدخال وإخراج (I/O Project): بناء برنامج واجهة أوامر (Command Line Program)
هذا الفصل هو مراجعة للعديد من المهارات التي تعلمتها حتى الآن واستكشاف لعدد قليل من ميزات المكتبة القياسية (standard library). سنقوم ببناء أداة واجهة أوامر (command line tool) تتفاعل مع مدخلات ومخرجات الملفات وواجهة الأوامر لممارسة بعض مفاهيم Rust التي أصبحت تتقنها الآن.
إن سرعة Rust وأمانها، وإنتاجها لملف ثنائي واحد (single binary)، ودعمها للمنصات المتعددة (cross-platform) يجعلها لغة مثالية لإنشاء أدوات واجهة الأوامر، لذا في مشروعنا، سنقوم بصنع نسختنا الخاصة من أداة البحث الكلاسيكية في واجهة الأوامر grep (البحث العالمي عن تعبير نمطي والطباعة - globally search a regular expression and print). في أبسط حالات الاستخدام، تبحث grep في ملف محدد عن سلسلة نصية (string) محددة. للقيام بذلك، تأخذ grep كوسطاء (arguments) لها مسار ملف وسلسلة نصية. بعد ذلك، تقرأ الملف، وتجد الأسطر في ذلك الملف التي تحتوي على argument السلسلة النصية، وتطبع تلك الأسطر.
على طول الطريق، سنوضح كيفية جعل أداة واجهة الأوامر الخاصة بنا تستخدم ميزات الطرفية (terminal) التي تستخدمها العديد من أدوات واجهة الأوامر الأخرى. سنقرأ قيمة متغير بيئة (environment variable) للسماح للمستخدم بتكوين سلوك أداتنا. سنقوم أيضاً بطباعة رسائل الخطأ إلى تدفق وحدة تحكم الخطأ القياسي (stderr) بدلاً من المخرجات القياسية (stdout) بحيث يمكن للمستخدم، على سبيل المثال، إعادة توجيه المخرجات الناجحة إلى ملف مع الاستمرار في رؤية رسائل الخطأ على الشاشة.
قام أحد أعضاء مجتمع Rust، وهو أندرو غالانت (Andrew Gallant)، بالفعل بإنشاء نسخة كاملة الميزات وسريعة جداً من grep تسمى ripgrep. وبالمقارنة، ستكون نسختنا بسيطة للغاية، ولكن هذا الفصل سيعطيك بعض المعرفة الخلفية التي تحتاجها لفهم مشروع واقعي مثل ripgrep.
سيجمع مشروع grep الخاص بنا عدداً من المفاهيم التي تعلمتها حتى الآن:
- تنظيم الكود (الفصل 7)
- استخدام المتجهات (vectors) والسلاسل النصية (الفصل 8)
- معالجة الأخطاء (Handling errors) (الفصل 9)
- استخدام السمات (traits) وفترات الحياة (lifetimes) حيثما كان ذلك مناسباً (الفصل 10)
- كتابة الاختبارات (Writing tests) (الفصل 11)
سنقدم أيضاً بإيجاز الإغلاقات (closures)، والمكررات (iterators)، وكائنات السمات (trait objects)، والتي سيغطيها الفصل 13 و الفصل 18 بالتفصيل.