شروحات الكمبيوتر والإنترنت والموبايل

تسلسل rust_decimal في async-graphql بدون نوع مخصص

في عالم تطوير البرمجيات، تعتبر لغة Rust واحدة من أكثر اللغات الأمامية إقبالاً نظرًا لسرعتها وأمانها. يعتبر استخدام مكتبة async-graphql أداة قوية لإنشاء واجهات برمجة التطبيقات، لكن أحيانًا تواجه المطورين تحديات في تسلسل البيانات، خاصة عند التعامل مع مكتبة rust_decimal. في هذا المقال، سنستعرض كيفية استخدام مكتبة async-graphql لتسلسل الأعداد العشرية (decimal) بدون الحاجة إلى تعريف نوع مخصص (custom scalar type).

ما هي مكتبة async-graphql؟

مكتبة async-graphql هي إطار عمل لتطوير واجهات برمجة التطبيقات من نوع GraphQL تعتمد على التعابير غير المتزامنة. تُستخدم هذه المكتبة في بيئات Rust لتسهيل عملية استدعاء البيانات ومعالجتها بكفاءة عالية. تتيح async-graphql للمطورين إمكانية إنشاء تتطبيقات ديناميكية وقابلة للتوسع. ولكن، بالتزامن مع ذلك، قد تظهر مشاكل عند محاولة تسلسل أنواع معينة من البيانات مثل الأعداد العشرية.

تحدي تسلسل الأعداد العشرية

عند العمل مع مكتبة rust_decimal، يجد المطورون أن تسلسل القيم العشرية يمثل تحديًا، حيث تتطلب هذه المكتبة استخدام نوع مخصص. لكن، هناك طرق للتغلب على هذا التحدي دون الحاجة لتعريف نوع مخصص مع الحفاظ على فعالية الأداء. يعتمد هذا الحل على استخدام البيانات المخصصة أو أنواع الهياكل (structs) الذي يوفره Rust.

الحل المقترح لتسلسل الأعداد العشرية

فيما يلي مثال عملي حول كيفية تسلسل بيانات decimal بدون استخدام نوع مخصص:

[dependencies]
async-graphql = { version = "7.0.11", features = ["decimal"] }
rust_decimal = { version = "1.36.0", features = ["serde-with-arbitrary-precision"] }
serde = { version = "1.0.215", default-features = false }
serde_json = { version = "1.0.133", default-features = false }
tokio = { version = "1.42.0", features = ["full"] }

باستخدام هذه المكتبات، يمكن تعريف هيكل خاص يستخدم البيانات العشرية. هذا الهيكل يمكن أن يستخدم serde لتسهيل عملية التسلسل:

#[derive(serde::Serialize, serde::Deserialize)]
struct MyDecimal(Decimal);

تنفيذ تسلسل الأعداد العشرية

يمكن تنفيذ تسلسل البيانات من خلال تقديم دوال parse وto_value التي تعيد تمثيل القيمة العشرية بطريق لا يتطلب تعريف نوع مخصص. في هذه الطريقة، نقرنا على استخدام قدرات Rust المتقدمة للتمكن من التعامل مع البيانات بشكل مرن:

#[Scalar]
impl ScalarType for MyDecimal {
    fn parse(value: Value) -> async_graphql::InputValueResult {
        if let Value::String(s) = value {
            Ok(MyDecimal(Decimal::from_str(&s).map_err(|_| "القيمة العشرية غير صالحة")?))
        } else {
            Err("نوع غير صالح للعدد العشري".into())
        }
    }
    fn to_value(&self) -> Value {
        if let Ok(n) = serde_json::Number::from_str(&self.0.to_string()) {
            Value::Number(n)
        } else {
            Value::String(self.0.to_string())
        }
    }
}

أهمية هذه الحلول

باستخدام الطريقة الموضحة أعلاه، بات بإمكان المطورين تسلسل البيانات العشرية بسهولة ودون الحاجة إلى أنواع مخصصة. يسهل هذا الأمر بشكل كبير تطوير واجهات برمجة التطبيقات المعقدة حيث تتضمن العديد من الحقول العشرية. كما أنها تساهم في تحسين الأداء وتقليل التعقيد في الكود، مما يؤدي إلى بيئات تطوير أكثر إنتاجية.

كخلاصة، يقدم المقال شرحًا وافيًا عن كيفية استخدام مكتبة async-graphql لتسلسل الأعداد العشرية باستخدام rust_decimal دون الحاجة إلى أنواع مخصصة، وهو ما يعد خيارًا مثاليًا للمطورين الذين يبحثون عن تحسين الكود وتسهيل عملية التطوير. هذا الحل ليس فقط فعّالًا ولكنه أيضًا يجسد إمكانيات Rust الرائعة في التعامل مع البيانات بطريق مرنة ومتطورة.

فهد السلال

خبير تقني متخصص في شروحات الكمبيوتر والإنترنت والموبايل، يتمتع بخبرة واسعة في تقديم حلول تقنية مبتكرة ومبسطة. يهدف فهد إلى مساعدة المستخدمين على تحسين تجربتهم التقنية من خلال مقالات وأدلة عملية واضحة وسهلة الفهم.
زر الذهاب إلى الأعلى
Don`t copy text!