التحقق من صحة البيانات في Rust: مراجعة للمكتبات والمناهج العملية
التحقق من صحة البيانات هو أحد الركائز الأساسية لتطوير برمجيات موثوقة. في Rust، اللغة التي تشتهر بأمان الذاكرة والكتابة الصارمة، يصل التحقق من صحة البيانات المدخلة إلى مستوى جديد. في هذه المقالة، سنستعرض الأدوات والمكتبات التي تساعد مطوري Rust على تنفيذ تحقق مرن وفعال من صحة البيانات، وسنلقي نظرة على أمثلة كود محددة.
لماذا نحتاج إلى التحقق من صحة البيانات في Rust؟
تكتشف Rust بالفعل في مرحلة التجميع العديد من الأخطاء المتعلقة بالأنواع والملكية. ومع ذلك، لا يمكن للمترجم التحقق من البيانات القادمة من العالم الخارجي (إدخال المستخدم، طلبات API، الملفات). هنا يأتي دور التحقق من الصحة. فهو يسمح بـ:
- ضمان سلامة البيانات — التحقق من أن البريد الإلكتروني يتوافق مع التنسيق، وأن العمر ضمن نطاق معقول.
- زيادة الأمان — منع الحقن والإدخال غير الصحيح.
- تحسين تجربة المستخدم — تقديم رسائل خطأ واضحة.
- الحفاظ على الأداء — تعمل مكتبات التحقق من الصحة في Rust بأقل تكاليف إضافية.
المكتبات الرئيسية للتحقق من صحة البيانات في Rust
يقدم نظام Rust البيئي العديد من الحلول الناضجة. دعنا نستعرض الأكثر شيوعًا.
1. مكتبة validator
validator هي على الأرجح أشهر crate للتحقق من صحة هياكل البيانات. تعتمد على السمات (derive macros) وتسمح بوصف قواعد التحقق مباشرة في تعريف الهيكل.
مثال على الاستخدام:
use validator::Validate;
#[derive(Validate)]struct User { #[validate(email)] email: String,
#[validate(length(min = 3, max = 50))] username: String,
#[validate(range(min = 18, max = 120))] age: u8,}
fn main() { let user = User { email: "invalid-email".to_string(), username: "Jo".to_string(), age: 15, };
match user.validate() { Ok(_) => println!("البيانات صحيحة"), Err(errors) => { for (field, err) in &errors.field_errors() { println!("خطأ في الحقل {}: {:?}", field, err); } } }}تدعم المكتبة أدوات التحقق المضمنة: email، url، length، range، must_match وغيرها. يمكنك أيضًا كتابة دوال التحقق الخاصة بك.
2. مكتبة garde
garde هي بديل أكثر حداثة ومرونة. تستخدم أيضًا derive macros، ولكنها توفر إمكانيات أكثر لتكوين القواعد والعمل مع الهياكل المتداخلة.
مثال على الاستخدام:
use garde::Validate;
#[derive(Validate)]struct LoginForm { #[garde(email)] email: String,
#[garde(length(min = 8))] password: String,}
fn main() { let form = LoginForm { email: "test@example.com".to_string(), password: "123".to_string(), };
if let Err(errors) = form.validate() { println!("أخطاء التحقق: {}", errors); } else { println!("النموذج صحيح"); }}السمة المميزة لـ garde هي دعم أدوات التحقق غير المتزامنة، وهو أمر مناسب للفحوصات التي تتطلب الوصول إلى قاعدة البيانات أو API خارجي.
3. التحقق اليدوي باستخدام Result و Option
في بعض الأحيان لا تكون هناك حاجة لاستخدام مكتبة كاملة. تسمح Rust بتنفيذ التحقق من الصحة باستخدام دوال بسيطة ومطابقة الأنماط. وهذا يمنحك تحكمًا كاملاً في المنطق.
مثال على التحقق اليدوي:
fn validate_username(username: &str)