From eb8e7bc48a08bb405ab1fad6d094110a23ff94b2 Mon Sep 17 00:00:00 2001 From: nutcas3 Date: Sat, 25 Apr 2026 00:52:19 +0300 Subject: [PATCH] feat: Add Redis serialization trait implementations for SubscriberAccount and UsageEvent types - Add redis::FromRedisValue/ToRedisArgs/ToSingleRedisArg imports - Implement FromRedisValue for SubscriberAccount with JSON deserialization and ParsingError mapping - Implement ToRedisArgs for SubscriberAccount with JSON serialization - Implement ToSingleRedisArg for SubscriberAccount - Implement FromRedisValue for UsageEvent with JSON deserialization and ParsingError mapping - Implement ToRedisArgs for UsageEvent with JSON serial --- apps/charging-engine/src/charging/types.rs | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/apps/charging-engine/src/charging/types.rs b/apps/charging-engine/src/charging/types.rs index d960d77..803d6b5 100644 --- a/apps/charging-engine/src/charging/types.rs +++ b/apps/charging-engine/src/charging/types.rs @@ -1,5 +1,6 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; +use redis::{FromRedisValue, ToRedisArgs, ToSingleRedisArg}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SubscriberAccount { @@ -95,3 +96,48 @@ pub struct Action { pub action_type: String, pub parameters: std::collections::HashMap, } + +// Redis trait implementations for serialization +impl FromRedisValue for SubscriberAccount { + fn from_redis_value(v: redis::Value) -> Result { + let json: String = redis::from_redis_value(v)?; + let account: SubscriberAccount = serde_json::from_str(&json) + .map_err(|e| redis::ParsingError::from(e.to_string()))?; + Ok(account) + } +} + +impl ToRedisArgs for SubscriberAccount { + fn write_redis_args(&self, out: &mut W) + where + W: redis::RedisWrite + ?Sized, + { + let json = serde_json::to_string(self) + .expect("Failed to serialize SubscriberAccount"); + json.write_redis_args(out) + } +} + +impl ToSingleRedisArg for SubscriberAccount {} + +impl FromRedisValue for UsageEvent { + fn from_redis_value(v: redis::Value) -> Result { + let json: String = redis::from_redis_value(v)?; + let event: UsageEvent = serde_json::from_str(&json) + .map_err(|e| redis::ParsingError::from(e.to_string()))?; + Ok(event) + } +} + +impl ToRedisArgs for UsageEvent { + fn write_redis_args(&self, out: &mut W) + where + W: redis::RedisWrite + ?Sized, + { + let json = serde_json::to_string(self) + .expect("Failed to serialize UsageEvent"); + json.write_redis_args(out) + } +} + +impl ToSingleRedisArg for UsageEvent {}