flare_core/common/serializer/
registry.rs1use super::formats::{JsonSerializer, ProtobufSerializer};
6use super::traits::Serializer;
7use crate::common::protocol::SerializationFormat;
8use std::collections::HashMap;
9use std::sync::Arc;
10use std::sync::RwLock;
11
12lazy_static::lazy_static! {
13 static ref SERIALIZATION_REGISTRY: SerializationRegistry = {
15 let registry = SerializationRegistry::new();
16 registry.register_defaults();
18 registry
19 };
20}
21
22pub struct SerializationRegistry {
26 serializers: Arc<RwLock<HashMap<String, Arc<dyn Serializer>>>>,
27}
28
29impl Default for SerializationRegistry {
30 fn default() -> Self {
31 Self {
32 serializers: Arc::new(RwLock::new(HashMap::new())),
33 }
34 }
35}
36
37impl SerializationRegistry {
38 pub fn new() -> Self {
40 Self::default()
41 }
42
43 pub fn register_defaults(&self) {
45 self.register("protobuf", Arc::new(ProtobufSerializer));
46 self.register("json", Arc::new(JsonSerializer));
47 }
48
49 pub fn register(&self, name: &str, serializer: Arc<dyn Serializer>) {
68 if let Ok(mut serializers) = self.serializers.write() {
69 serializers.insert(name.to_string(), serializer);
70 }
71 }
72
73 pub fn find(&self, name: &str) -> Option<Arc<dyn Serializer>> {
81 self.serializers
82 .read()
83 .ok()
84 .and_then(|serializers| serializers.get(name).map(Arc::clone))
85 }
86
87 pub fn find_by_format(&self, format: SerializationFormat) -> Option<Arc<dyn Serializer>> {
89 let name = match format {
90 SerializationFormat::Protobuf => "protobuf",
91 SerializationFormat::Json => "json",
92 };
93 self.find(name)
94 }
95
96 pub fn auto_detect(&self, data: &[u8]) -> Vec<Arc<dyn Serializer>> {
100 let mut detected = Vec::new();
101 if let Ok(serializers) = self.serializers.read() {
102 for serializer in serializers.values() {
103 if serializer.can_detect(data) {
104 detected.push(Arc::clone(serializer));
105 }
106 }
107 }
108 detected
109 }
110
111 pub fn global() -> &'static SerializationRegistry {
113 &SERIALIZATION_REGISTRY
114 }
115}
116
117pub struct SerializationUtil;
121
122impl SerializationUtil {
123 pub fn get_serializer(format: SerializationFormat) -> Option<Arc<dyn Serializer>> {
125 SerializationRegistry::global().find_by_format(format)
126 }
127
128 pub fn get_serializer_by_name(name: &str) -> Option<Arc<dyn Serializer>> {
130 SerializationRegistry::global().find(name)
131 }
132
133 pub fn find(name: &str) -> Option<Arc<dyn Serializer>> {
135 Self::get_serializer_by_name(name)
136 }
137
138 pub fn auto_detect(data: &[u8]) -> Vec<Arc<dyn Serializer>> {
142 SerializationRegistry::global().auto_detect(data)
143 }
144
145 pub fn register_custom(serializer: Arc<dyn Serializer>) {
159 SerializationRegistry::global().register(serializer.name(), serializer);
160 }
161}
162
163#[cfg(test)]
164mod tests {
165 use super::*;
166
167 #[test]
168 fn test_serialization_registry() {
169 let registry = SerializationRegistry::new();
170 registry.register_defaults();
171
172 assert!(registry.find("protobuf").is_some());
173 assert!(registry.find("json").is_some());
174 assert!(registry.find("unknown").is_none());
175 }
176
177 #[test]
178 fn test_auto_detect_json() {
179 let data = b"{\"message_id\":\"test\"}";
180 let registry = SerializationRegistry::new();
181 registry.register_defaults();
182
183 let serializers = registry.auto_detect(data);
184 assert!(serializers.iter().any(|s| s.name() == "json"));
186 }
187}