التحقق من صحة البيانات في Rust: المكتبات والمناهج

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التحقق من صحة البيانات في Rust: نظرة عامة على المكتبات والمناهج العملية



في التطوير الحديث باستخدام Rust، خاصة عند إنشاء خدمات الويب وواجهات برمجة التطبيقات (API)، يُعد التحقق من صحة البيانات الواردة مهمة بالغة الأهمية. توفر لغة Rust بالفعل نظامًا قويًا للأنواع (type system) يمنع فئات كاملة من الأخطاء في مرحلة التجميع. ومع ذلك، للتحقق من منطق الأعمال (على سبيل المثال، الحد الأدنى لطول كلمة المرور، صحة البريد الإلكتروني، نطاق الأرقام)، هناك حاجة إلى أدوات إضافية. في هذه المقالة، سنستعرض ثلاث مكتبات شائعة للتحقق من صحة البيانات في Rust: validator و garde و valitron.



1. مكتبة validator



validator هي على الأرجح المكتبة الأكثر شهرة ونضجًا للتحقق من صحة الهياكل (structs) في Rust. وهي مبنية على السمات (derive macros) وتدعم العديد من القواعد المضمنة.



التثبيت:

[dependencies]validator = { version = "0.18", features = ["derive"] }


مثال على الاستخدام:

use validator::Validate;

#[derive(Debug, Validate)]struct User { #[validate(length(min = 3, max = 20))] username: String,

#[validate(email)] email: String,

#[validate(range(min = 18, max = 120))] age: u32,

#[validate(required)] password: Option<String>,}

fn main() { let user = User { username: "Jo".to_string(), email: "invalid-email".to_string(), age: 15, password: None, };

match user.validate() { Ok(_) => println!("تم التحقق من الصحة بنجاح!"), Err(errors) => { for (field, err) in &errors.errors() { println!("خطأ في الحقل '{}': {:?}", field, err); } } }}


المزايا:

  • عدد كبير من أدوات التحقق المضمنة: البريد الإلكتروني، URL، الطول، النطاق، التعبيرات النمطية.
  • دعم وظائف التحقق المخصصة من خلال السمة custom.
  • تكامل جيد مع أطر عمل الويب (Actix-web, Axum, Rocket).


العيوب:

  • يعتمد على الماكرو، مما قد يبطئ عملية التجميع.
  • يتم إرجاع الأخطاء على شكل HashMap، مما يتطلب معالجة إضافية لواجهة API.


2. مكتبة garde



garde هي بديل أحدث وأسرع لـ validator. كما أنها تستخدم derive-ماكرو، ولكنها تقدم واجهة برمجة تطبيقات أكثر مرونة وأداءً أفضل.



التثبيت:

[dependencies]garde = "0.20"


مثال على الاستخدام:

use garde::Validate;

#[derive(Debug, Validate)]struct LoginRequest { #[garde(length(min = 3, max = 50))] username: String,

#[garde(ascii, length(min = 8))] password: String,

#[garde(skip)] remember_me: bool,}

fn main() { let req = LoginRequest { username: "ab".to_string(), password: "1234567".to_string(), remember_me: true, };

if let Err(errors) = req.validate() { for error in &errors { println!("خطأ: {} - {}", error.path(), error.message()); } } else { println!("تم التحقق من الصحة بنجاح!"); }}


المزايا:

  • أداء عالٍ بفضل الكود المحسّن.
  • رسائل خطأ واضحة مع مسار الحقل.
  • دعم الهياكل المتداخلة والمجموعات.
  • إمكانية إنشاء قواعد مخصصة بدون ماكرو.


العيوب:

  • عدد أقل من أدوات التحقق المضمنة (لا يوجد بريد إلكتروني، URL افتراضيًا).
  • مجتمع أصغر مقارنة بـ validator.


3. مكتبة valitron



valitron هي مكتبة خفيفة الوزن لا تستخدم

توصيات