مقدمة: لماذا التوثيق في Rust هو أكثر من مجرد تعليقات
\n\nيُعرف نظام Rust البيئي بصرامته وموثوقيته. ومع ذلك، حتى الكود الأكثر أناقة يصبح عديم الفائدة بدون توثيق عالي الجودة. على المستوى الأساسي، يكفي كتابة بضعة أسطر من /// للدوال العامة. ولكن عندما ينمو مشروعك ليشمل عدة حزم (crates) مع عشرات الوحدات، تبرز الحاجة إلى تقنيات التوثيق المتقدمة.
في هذه المقالة، سنستعرض الأدوات والتقنيات التي ستساعدك في إنشاء توثيق بمستوى enterprise: من الاختبار التلقائي للأمثلة إلى إنشاء الكتب والتكامل مع CI/CD.
\n\n1. Doctests: توثيق لا يكذب
\n\nالميزة الرئيسية لـ rustdoc هي إمكانية تضمين أمثلة كود قابلة للتنفيذ مباشرة في التعليقات. يتم تجميع هذه الأمثلة وتشغيلها تلقائيًا عند تشغيل cargo test. وهذا يضمن أن توثيقك محدث دائمًا.
doctest أساسي
\n/// تُرجع مجموع رقمين.\n///\n/// # مثال\n///\n/// ```\n/// let result = my_crate::add(2, 3);\n/// assert_eq!(result, 5);\n/// ```\npub fn add(a: i32, b: i32) -> i32 {\n a + b\n}\n\nتقنيات متقدمة مع doctest
\nيمكنك إخفاء أسطر الإعداد التي لا ينبغي عرضها في التوثيق باستخدام # :
/// # مثال مع التهيئة\n///\n/// ```\n/// # use std::collections::HashMap;\n/// let mut map = HashMap::new();\n/// map.insert("key", 42);\n/// assert_eq!(map.get("key"), Some(&42));\n/// ```\n\nيمكنك أيضًا التحقق من أن الكود لا يتم تجميعه (على سبيل المثال، عرض أخطاء وقت التجميع):
\n/// ```compile_fail\n/// let x: i32 = "سلسلة"; // خطأ: عدم تطابق الأنواع\n/// ```\n\n2. سمات التوثيق: التحكم والبيانات الوصفية
\n\nتتيح السمات #[doc(...)] ضبط عرض التوثيق بدقة.
إخفاء العناصر
\n/// دالة داخلية، غير مخصصة للاستخدام العام.\n#[doc(hidden)]\npub fn internal_helper() {}\n\nالتصنيف والبحث
\n/// مجموعة أدوات للعمل مع الشبكة.\n#[doc(alias = "net")]\n#[doc(alias = "socket")]\npub mod network {\n // ...\n}\n\nتضمين التوثيق من مكان آخر
\n/// راجع [توثيق الوحدة](index.html) للحصول على معلومات عامة.\n#[doc(include = "docs/faq.md")]\npub fn complex_function() {}\n\n3. Cross-references والتنقل
\n\nيدعم Rustdoc الروابط إلى عناصر التوثيق الأخرى. وهذا يخلق هيكلًا متماسكًا وسهل القراءة.
\n\nروابط إلى الدوال والأنواع
\n/// استخدم [`Config::new`] لإنشاء مثيل.\n///\n/// للإعدادات الأكثر تعقيدًا، راجع الوحدة [`config`].\npub struct Config { /* ... */ }\n\nروابط إلى الحزم الخارجية
\n/// تستخدم هذه الدالة [serde_json] للتسلسل.\n///\n/// [serde_json]: https://docs.rs/serde_json\npub fn to_json() {}\n\n4. أدوات للمشاريع الكبيرة: mdBook وتوثيق الحزمة
\n\nعندما يصبح cargo doc وحده غير كافٍ، يأتي mdBook للإنقاذ - وهي أداة لإنشاء الكتب من ملفات Markdown. وهي مثالية لكتابة الأدلة والدروس والتوثيق المعماري.
بداية سريعة مع mdBook
\n# التثبيت\ncargo install mdbook\n\n# إنشاء مشروع\nmdbook init my-book\ncd my-book\nmdbook serve --open\n\nالتكامل مع rustdoc
\nيمكنك تضمين التوثيق من mdBook في cargo doc باستخدام السمة #[doc = include_str!()]:
/// # البنية\n///\n/// وصف تفصيلي لبنية المكتبة:\n///\n#[doc = include_str!("../docs/architecture.md")]\npub mod core {\n // ...\n}\n\n