البرمجة

تخصيص ترميز وفك ترميز Circe لسمات مختومة بدون حالات فرعية

عند استخدام السمات المختومة كأنواع معممة لتوجيه النماذج بشكل شامل، يصبح من المهم التفكير في كيفية ترميز وفك ترميز هذه النماذج بشكل فعال باستخدام Circe. في الحالة التي تحتاج فيها إلى ترميز وفك ترميز سمات ختم مكونة من عدم وجود حالات فرعية (Arity 0)، يمكن أن يكون التحدي ملحاً.

قبل الإشارة إلى الإصدار 0.5.0 من Circe الذي سيوفر تكوينًا لهذا السيناريو، يمكنك استخدام حلاً مؤقتًا. يمكنك تحقيق هذا بواسطة تعريف مخصص لترميز وفك ترميز السمة المختومة.

لبداية الأمر، يمكنك إنشاء ملف يحتوي على المستوردات الضرورية وتعريف الحالات المختومة:

scala
import io.circe.{Decoder, Encoder, HCursor, Json} import io.circe.syntax._ sealed trait State case object On extends State case object Off extends State

ثم، يمكنك إنشاء كائن مساعد يتولى ترميز وفك ترميز السمة المختومة:

scala
object StateCodec { implicit val encodeState: Encoder[State] = Encoder.instance { case On => Json.fromString("On") case Off => Json.fromString("Off") } implicit val decodeState: Decoder[State] = Decoder.instance { cursor: HCursor => cursor.as[String].flatMap { case "On" => Right(On) case "Off" => Right(Off) case _ => Left(new Exception("Invalid State")) } } }

الآن، يمكنك استخدام هذا الملف لترميز وفك ترميز الحالات الختمة كسلاسلات:

scala
import io.circe.parser.decode import io.circe.syntax._ // احتياج إلى استيراد الملف الذي يحتوي على StateCodec object Main extends App { import StateCodec._ val a: State = Off val encoded: String = a.asJson.noSpaces println(encoded) // يجب أن يكون "Off" val decoded: Either[io.circe.Error, State] = decode[State]("On") println(decoded) // يجب أن يكون Right(On) }

هذا الحلا يقوم بتعريف تشفير وفك تشفير خاص بك لحالات السمة المختومة ويوفر لك القدرة على تنفيذ هذا النوع من العمليات حتى يتم إطلاق الإصدار 0.5.0 من Circe الذي سيسهل هذا النوع من التخصيص.

المزيد من المعلومات

تتيح لنا السمات المختومة في لغة سكالا إنشاء نماذج محددة مسبقًا وتوجيه النماذج بشكل شامل باستخدام هيكل مختوم. في المثال الذي قدمته، يتم تعريف السمة المختومة State باعتبارها نوعًا يحتوي على حالتين: On وOff، وتستخدم كبديل لتعريف enum في اللغات الأخرى.

في Circe، الذي يعتبر من أحد أدوات تسلسل JSON الشائعة في سكالا، يمكن أن تكون عملية ترميز وفك ترميز السمات المختومة تحتاج إلى التخصيص، خاصةً عندما تكون الحالات خالية من الحقول. في المثال، تم استخدام كائن StateCodec لتحديد كيفية ترميز وفك ترميز الحالات.

عند استخدام Circe، يمكن أن يكون الإصدار 0.5.0 الذي تم الإشارة إليه في السياق يوفر تكوينًا إضافيًا لهذا النوع من الحالات حيث يمكنك تعريف ترميز وفك ترميز افتراضي للسمات المختومة بناءً على اسم الحالة نفسه.

يمكنك دائماً مراجعة مستندات Circe ومشاريع ذات صلة على GitHub للحصول على آخر المستجدات والتوجيهات. كما يُفضل دائمًا متابعة أخبار المكتبات والأدوات التي تستخدمها للتأكد من استخدام أحدث الميزات والتحسينات.

زر الذهاب إلى الأعلى