pub enum FieldValue {
Show 20 variants
Bool(bool),
I8(i8),
I16(i16),
I32(i32),
I64(i64),
U8(u8),
U16(u16),
U32(u32),
U64(u64),
Usize(usize),
F32(f32),
F64(f64),
String(String),
Bytes(Vec<u8>),
JsonObject(String),
BinaryObject(Vec<u8>),
Array(Vec<FieldValue>),
Optional(Option<Box<FieldValue>>),
Object(HashMap<String, FieldValue>),
Enum {
variant: String,
data: Option<Box<FieldValue>>,
},
}Expand description
Universal type-safe container for all serializable field values
This enum provides a unified representation for all possible serializable values in the Train Station serialization system. It maintains type safety while enabling uniform handling in the serialization pipeline, supporting both primitive types and complex data structures.
The enum uses Rust’s tagged union optimization for efficient memory layout, with larger variants (Optional, Enum) using heap allocation to minimize the base enum size. All variants support comprehensive validation and type conversion.
§Variants
§Primitive Types
Bool(bool)- Boolean true/false valuesI8(i8)- 8-bit signed integers (-128 to 127)I16(i16)- 16-bit signed integers (-32,768 to 32,767)I32(i32)- 32-bit signed integers (-2^31 to 2^31-1)I64(i64)- 64-bit signed integers (-2^63 to 2^63-1)U8(u8)- 8-bit unsigned integers (0 to 255)U16(u16)- 16-bit unsigned integers (0 to 65,535)U32(u32)- 32-bit unsigned integers (0 to 2^32-1)U64(u64)- 64-bit unsigned integers (0 to 2^64-1)Usize(usize)- Platform-specific size integersF32(f32)- 32-bit floating point numbersF64(f64)- 64-bit floating point numbersString(String)- UTF-8 encoded text strings
§Complex Types
Bytes(Vec<u8>)- Raw binary data arraysJsonObject(String)- JSON-serialized object stringsBinaryObject(Vec<u8>)- Binary-serialized object dataArray(Vec<FieldValue>)- Heterogeneous value arraysOptional(Option<Box<FieldValue>>)- Nullable field valuesObject(HashMap<String, FieldValue>)- Key-value object mapsEnum { variant: String, data: Option<Box<FieldValue>> }- Enum variants with optional data
§Type Conversion
The enum provides comprehensive type conversion capabilities:
- Numeric conversions: Automatic conversion between compatible integer and float types
- Range validation: Overflow/underflow checking for all conversions
- Sign validation: Proper handling of signed/unsigned type conversions
- String parsing: Hex string parsing for byte array conversion
§Error Handling
All conversion methods return SerializationResult<T> with detailed error information:
- Type mismatch errors: Clear indication of expected vs actual types
- Range validation errors: Specific overflow/underflow details
- Parsing errors: Detailed hex string parsing failure information
- Field context: Error messages include field names for debugging
§Performance Characteristics
- Zero-copy operations: Small variants stored inline for maximum performance
- Efficient conversions: Optimized type conversion with minimal allocations
- Memory layout: Tagged union optimization for minimal memory overhead
- Validation speed: Fast type checking with early return on mismatches
§Thread Safety
This type is thread-safe and can be shared between threads. All variants
implement Clone and PartialEq for flexible usage patterns.
Variants§
Bool(bool)
Boolean true/false values
I8(i8)
8-bit signed integers (-128 to 127)
I16(i16)
16-bit signed integers (-32,768 to 32,767)
I32(i32)
32-bit signed integers (-2^31 to 2^31-1)
I64(i64)
64-bit signed integers (-2^63 to 2^63-1)
U8(u8)
8-bit unsigned integers (0 to 255)
U16(u16)
16-bit unsigned integers (0 to 65,535)
U32(u32)
32-bit unsigned integers (0 to 2^32-1)
U64(u64)
64-bit unsigned integers (0 to 2^64-1)
Usize(usize)
Platform-specific size integers for array lengths and indices
F32(f32)
32-bit floating point numbers with single precision
F64(f64)
64-bit floating point numbers with double precision
String(String)
UTF-8 encoded text strings
Bytes(Vec<u8>)
Raw binary data arrays for efficient storage
JsonObject(String)
JSON-serialized object strings for human-readable format
BinaryObject(Vec<u8>)
Binary-serialized object data for compact storage
Array(Vec<FieldValue>)
Heterogeneous arrays of field values
Optional(Option<Box<FieldValue>>)
Nullable field values that may be None
Object(HashMap<String, FieldValue>)
Key-value object maps for structured data
Enum
Enum variants with optional associated data
Supports three enum variant types:
- Unit variant:
Enum { variant: "VariantName", data: None } - Tuple variant:
Enum { variant: "VariantName", data: Some(Array([...])) } - Struct variant:
Enum { variant: "VariantName", data: Some(Object({...})) }
Implementations§
Source§impl FieldValue
impl FieldValue
Sourcepub fn from_usize(value: usize) -> Self
pub fn from_usize(value: usize) -> Self
Sourcepub fn from_string(value: String) -> Self
pub fn from_string(value: String) -> Self
Creates a string field value from an owned string
§Arguments
value- Owned string to store
§Returns
A FieldValue::String variant containing the string value
Examples found in repository?
85 fn to_field_value(&self) -> FieldValue {
86 match self.to_json() {
87 Ok(json_str) => FieldValue::from_json_object(json_str),
88 Err(_) => FieldValue::from_string("serialization_error".to_string()),
89 }
90 }
91}
92
93impl FromFieldValue for VersionedData {
94 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
95 // Try JSON object first
96 if let Ok(json_data) = value.as_json_object() {
97 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
98 field: field_name.to_string(),
99 message: format!("Failed to deserialize VersionedData from JSON: {}", e),
100 });
101 }
102
103 // Try binary object
104 if let Ok(binary_data) = value.as_binary_object() {
105 return Self::from_binary(binary_data).map_err(|e| {
106 SerializationError::ValidationFailed {
107 field: field_name.to_string(),
108 message: format!("Failed to deserialize VersionedData from binary: {}", e),
109 }
110 });
111 }
112
113 Err(SerializationError::ValidationFailed {
114 field: field_name.to_string(),
115 message: format!(
116 "Expected JsonObject or BinaryObject for VersionedData, found {}",
117 value.type_name()
118 ),
119 })
120 }
121}
122
123/// Validated user input with constraints
124#[derive(Debug, Clone, PartialEq)]
125pub struct ValidatedUserInput {
126 pub username: String,
127 pub email: String,
128 pub age: u16,
129 pub preferences: HashMap<String, String>,
130}
131
132impl StructSerializable for ValidatedUserInput {
133 fn to_serializer(&self) -> StructSerializer {
134 StructSerializer::new()
135 .field("username", &self.username)
136 .field("email", &self.email)
137 .field("age", &self.age)
138 .field("preferences", &self.preferences)
139 }
140
141 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
142 let username: String = deserializer.field("username")?;
143 let email: String = deserializer.field("email")?;
144 let age: u16 = deserializer.field("age")?;
145 let preferences: HashMap<String, String> = deserializer.field("preferences")?;
146
147 // Validate username
148 if username.is_empty() || username.len() > 50 {
149 return Err(SerializationError::ValidationFailed {
150 field: "username".to_string(),
151 message: "Username must be 1-50 characters long".to_string(),
152 });
153 }
154
155 if !username
156 .chars()
157 .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
158 {
159 return Err(SerializationError::ValidationFailed {
160 field: "username".to_string(),
161 message:
162 "Username can only contain alphanumeric characters, underscores, and hyphens"
163 .to_string(),
164 });
165 }
166
167 // Validate email (basic check)
168 if !email.contains('@') || !email.contains('.') || email.len() < 5 {
169 return Err(SerializationError::ValidationFailed {
170 field: "email".to_string(),
171 message: "Invalid email format".to_string(),
172 });
173 }
174
175 // Validate age
176 if !(13..=120).contains(&age) {
177 return Err(SerializationError::ValidationFailed {
178 field: "age".to_string(),
179 message: "Age must be between 13 and 120".to_string(),
180 });
181 }
182
183 // Validate preferences
184 if preferences.len() > 20 {
185 return Err(SerializationError::ValidationFailed {
186 field: "preferences".to_string(),
187 message: "Too many preferences (maximum 20)".to_string(),
188 });
189 }
190
191 for (key, value) in &preferences {
192 if key.len() > 50 || value.len() > 200 {
193 return Err(SerializationError::ValidationFailed {
194 field: "preferences".to_string(),
195 message: format!("Preference key/value too long: {}", key),
196 });
197 }
198 }
199
200 Ok(ValidatedUserInput {
201 username,
202 email,
203 age,
204 preferences,
205 })
206 }
207}
208
209impl ToFieldValue for ValidatedUserInput {
210 fn to_field_value(&self) -> FieldValue {
211 match self.to_json() {
212 Ok(json_str) => FieldValue::from_json_object(json_str),
213 Err(_) => FieldValue::from_string("serialization_error".to_string()),
214 }
215 }
216}
217
218impl FromFieldValue for ValidatedUserInput {
219 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
220 // Try JSON object first
221 if let Ok(json_data) = value.as_json_object() {
222 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
223 field: field_name.to_string(),
224 message: format!("Failed to deserialize ValidatedUserInput from JSON: {}", e),
225 });
226 }
227
228 // Try binary object
229 if let Ok(binary_data) = value.as_binary_object() {
230 return Self::from_binary(binary_data).map_err(|e| {
231 SerializationError::ValidationFailed {
232 field: field_name.to_string(),
233 message: format!(
234 "Failed to deserialize ValidatedUserInput from binary: {}",
235 e
236 ),
237 }
238 });
239 }
240
241 Err(SerializationError::ValidationFailed {
242 field: field_name.to_string(),
243 message: format!(
244 "Expected JsonObject or BinaryObject for ValidatedUserInput, found {}",
245 value.type_name()
246 ),
247 })
248 }
249}
250
251/// Recovery helper for handling partial data
252#[derive(Debug, Clone, PartialEq)]
253pub struct RecoverableData {
254 pub critical_field: String,
255 pub important_field: Option<String>,
256 pub optional_field: Option<String>,
257 pub metadata: HashMap<String, String>,
258}
259
260impl StructSerializable for RecoverableData {
261 fn to_serializer(&self) -> StructSerializer {
262 StructSerializer::new()
263 .field("critical_field", &self.critical_field)
264 .field("important_field", &self.important_field)
265 .field("optional_field", &self.optional_field)
266 .field("metadata", &self.metadata)
267 }
268
269 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
270 // Critical field - must exist
271 let critical_field = deserializer.field("critical_field")?;
272
273 // Important field - try to recover if missing
274 let important_field = deserializer.field_optional("important_field")?;
275
276 // Optional field - graceful fallback
277 let optional_field = deserializer.field_optional("optional_field")?;
278
279 // Metadata - recover what we can
280 let metadata = deserializer.field_or("metadata", HashMap::new())?;
281
282 Ok(RecoverableData {
283 critical_field,
284 important_field,
285 optional_field,
286 metadata,
287 })
288 }
289}
290
291impl ToFieldValue for RecoverableData {
292 fn to_field_value(&self) -> FieldValue {
293 match self.to_json() {
294 Ok(json_str) => FieldValue::from_json_object(json_str),
295 Err(_) => FieldValue::from_string("serialization_error".to_string()),
296 }
297 }More examples
78 fn to_field_value(&self) -> FieldValue {
79 match self.to_json() {
80 Ok(json_str) => FieldValue::from_json_object(json_str),
81 Err(_) => FieldValue::from_string("serialization_error".to_string()),
82 }
83 }
84}
85
86impl FromFieldValue for PerformanceMetrics {
87 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
88 // Try JSON object first
89 if let Ok(json_data) = value.as_json_object() {
90 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
91 field: field_name.to_string(),
92 message: format!("Failed to deserialize PerformanceMetrics from JSON: {}", e),
93 });
94 }
95
96 // Try binary object
97 if let Ok(binary_data) = value.as_binary_object() {
98 return Self::from_binary(binary_data).map_err(|e| {
99 SerializationError::ValidationFailed {
100 field: field_name.to_string(),
101 message: format!(
102 "Failed to deserialize PerformanceMetrics from binary: {}",
103 e
104 ),
105 }
106 });
107 }
108
109 Err(SerializationError::ValidationFailed {
110 field: field_name.to_string(),
111 message: format!(
112 "Expected JsonObject or BinaryObject for PerformanceMetrics, found {}",
113 value.type_name()
114 ),
115 })
116 }
117}
118
119/// Large dataset for performance testing
120#[derive(Debug, Clone, PartialEq)]
121pub struct LargeDataset {
122 pub name: String,
123 pub values: Vec<f32>, // Changed from f64 to f32 (supported)
124 pub labels: Vec<String>,
125 pub feature_count: usize, // Simplified from Vec<Vec<f32>> to just a count
126 pub feature_dimension: usize, // Store dimensions separately
127 pub metadata: HashMap<String, String>,
128 pub timestamp_count: usize, // Simplified from Vec<u64> to just count
129}
130
131impl StructSerializable for LargeDataset {
132 fn to_serializer(&self) -> StructSerializer {
133 StructSerializer::new()
134 .field("name", &self.name)
135 .field("values", &self.values)
136 .field("labels", &self.labels)
137 .field("feature_count", &self.feature_count)
138 .field("feature_dimension", &self.feature_dimension)
139 .field("metadata", &self.metadata)
140 .field("timestamp_count", &self.timestamp_count)
141 }
142
143 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
144 let name = deserializer.field("name")?;
145 let values = deserializer.field("values")?;
146 let labels = deserializer.field("labels")?;
147 let feature_count = deserializer.field("feature_count")?;
148 let feature_dimension = deserializer.field("feature_dimension")?;
149 let metadata = deserializer.field("metadata")?;
150 let timestamp_count = deserializer.field("timestamp_count")?;
151
152 Ok(LargeDataset {
153 name,
154 values,
155 labels,
156 feature_count,
157 feature_dimension,
158 metadata,
159 timestamp_count,
160 })
161 }
162}
163
164impl ToFieldValue for LargeDataset {
165 fn to_field_value(&self) -> FieldValue {
166 match self.to_json() {
167 Ok(json_str) => FieldValue::from_json_object(json_str),
168 Err(_) => FieldValue::from_string("serialization_error".to_string()),
169 }
170 }
171}
172
173impl FromFieldValue for LargeDataset {
174 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
175 // Try JSON object first
176 if let Ok(json_data) = value.as_json_object() {
177 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
178 field: field_name.to_string(),
179 message: format!("Failed to deserialize LargeDataset from JSON: {}", e),
180 });
181 }
182
183 // Try binary object
184 if let Ok(binary_data) = value.as_binary_object() {
185 return Self::from_binary(binary_data).map_err(|e| {
186 SerializationError::ValidationFailed {
187 field: field_name.to_string(),
188 message: format!("Failed to deserialize LargeDataset from binary: {}", e),
189 }
190 });
191 }
192
193 Err(SerializationError::ValidationFailed {
194 field: field_name.to_string(),
195 message: format!(
196 "Expected JsonObject or BinaryObject for LargeDataset, found {}",
197 value.type_name()
198 ),
199 })
200 }
201}
202
203/// Configuration data (typical JSON use case)
204#[derive(Debug, Clone, PartialEq)]
205pub struct Configuration {
206 pub version: String,
207 pub debug_enabled: bool,
208 pub log_level: String,
209 pub database_settings: HashMap<String, String>,
210 pub feature_flags_enabled: bool, // Simplified from HashMap<String, bool>
211 pub max_connections: f32, // Simplified from HashMap<String, f64>
212 pub timeout_seconds: f32,
213}
214
215impl StructSerializable for Configuration {
216 fn to_serializer(&self) -> StructSerializer {
217 StructSerializer::new()
218 .field("version", &self.version)
219 .field("debug_enabled", &self.debug_enabled)
220 .field("log_level", &self.log_level)
221 .field("database_settings", &self.database_settings)
222 .field("feature_flags_enabled", &self.feature_flags_enabled)
223 .field("max_connections", &self.max_connections)
224 .field("timeout_seconds", &self.timeout_seconds)
225 }
226
227 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
228 let version = deserializer.field("version")?;
229 let debug_enabled = deserializer.field("debug_enabled")?;
230 let log_level = deserializer.field("log_level")?;
231 let database_settings = deserializer.field("database_settings")?;
232 let feature_flags_enabled = deserializer.field("feature_flags_enabled")?;
233 let max_connections = deserializer.field("max_connections")?;
234 let timeout_seconds = deserializer.field("timeout_seconds")?;
235
236 Ok(Configuration {
237 version,
238 debug_enabled,
239 log_level,
240 database_settings,
241 feature_flags_enabled,
242 max_connections,
243 timeout_seconds,
244 })
245 }
246}
247
248impl ToFieldValue for Configuration {
249 fn to_field_value(&self) -> FieldValue {
250 match self.to_json() {
251 Ok(json_str) => FieldValue::from_json_object(json_str),
252 Err(_) => FieldValue::from_string("serialization_error".to_string()),
253 }
254 }74 fn to_field_value(&self) -> FieldValue {
75 match self.to_json() {
76 Ok(json_str) => FieldValue::from_json_object(json_str),
77 Err(_) => FieldValue::from_string("serialization_error".to_string()),
78 }
79 }
80}
81
82impl FromFieldValue for ContactInfo {
83 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
84 // Try JSON object first
85 if let Ok(json_data) = value.as_json_object() {
86 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
87 field: field_name.to_string(),
88 message: format!("Failed to deserialize ContactInfo from JSON: {}", e),
89 });
90 }
91
92 // Try binary object
93 if let Ok(binary_data) = value.as_binary_object() {
94 return Self::from_binary(binary_data).map_err(|e| {
95 SerializationError::ValidationFailed {
96 field: field_name.to_string(),
97 message: format!("Failed to deserialize ContactInfo from binary: {}", e),
98 }
99 });
100 }
101
102 Err(SerializationError::ValidationFailed {
103 field: field_name.to_string(),
104 message: format!(
105 "Expected JsonObject or BinaryObject for ContactInfo, found {}",
106 value.type_name()
107 ),
108 })
109 }
110}
111
112/// Address struct
113#[derive(Debug, Clone, PartialEq)]
114pub struct Address {
115 pub street: String,
116 pub city: String,
117 pub state: String,
118 pub postal_code: String,
119 pub country: String,
120}
121
122impl StructSerializable for Address {
123 fn to_serializer(&self) -> StructSerializer {
124 StructSerializer::new()
125 .field("street", &self.street)
126 .field("city", &self.city)
127 .field("state", &self.state)
128 .field("postal_code", &self.postal_code)
129 .field("country", &self.country)
130 }
131
132 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
133 let street = deserializer.field("street")?;
134 let city = deserializer.field("city")?;
135 let state = deserializer.field("state")?;
136 let postal_code = deserializer.field("postal_code")?;
137 let country = deserializer.field("country")?;
138
139 Ok(Address {
140 street,
141 city,
142 state,
143 postal_code,
144 country,
145 })
146 }
147}
148
149impl ToFieldValue for Address {
150 fn to_field_value(&self) -> FieldValue {
151 match self.to_json() {
152 Ok(json_str) => FieldValue::from_json_object(json_str),
153 Err(_) => FieldValue::from_string("serialization_error".to_string()),
154 }
155 }
156}
157
158impl FromFieldValue for Address {
159 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
160 // Try JSON object first
161 if let Ok(json_data) = value.as_json_object() {
162 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
163 field: field_name.to_string(),
164 message: format!("Failed to deserialize Address from JSON: {}", e),
165 });
166 }
167
168 // Try binary object
169 if let Ok(binary_data) = value.as_binary_object() {
170 return Self::from_binary(binary_data).map_err(|e| {
171 SerializationError::ValidationFailed {
172 field: field_name.to_string(),
173 message: format!("Failed to deserialize Address from binary: {}", e),
174 }
175 });
176 }
177
178 Err(SerializationError::ValidationFailed {
179 field: field_name.to_string(),
180 message: format!(
181 "Expected JsonObject or BinaryObject for Address, found {}",
182 value.type_name()
183 ),
184 })
185 }
186}
187
188/// Project information struct
189#[derive(Debug, Clone, PartialEq)]
190pub struct Project {
191 pub name: String,
192 pub description: String,
193 pub status: ProjectStatus,
194 pub budget: f64,
195 pub team_members: Vec<String>,
196 pub milestones: Vec<Milestone>,
197 pub metadata: HashMap<String, String>,
198}
199
200impl StructSerializable for Project {
201 fn to_serializer(&self) -> StructSerializer {
202 StructSerializer::new()
203 .field("name", &self.name)
204 .field("description", &self.description)
205 .field("status", &self.status)
206 .field("budget", &self.budget)
207 .field("team_members", &self.team_members)
208 .field("milestones", &self.milestones)
209 .field("metadata", &self.metadata)
210 }
211
212 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
213 let name = deserializer.field("name")?;
214 let description = deserializer.field("description")?;
215 let status = deserializer.field("status")?;
216 let budget = deserializer.field("budget")?;
217 let team_members = deserializer.field("team_members")?;
218 let milestones = deserializer.field("milestones")?;
219 let metadata = deserializer.field("metadata")?;
220
221 Ok(Project {
222 name,
223 description,
224 status,
225 budget,
226 team_members,
227 milestones,
228 metadata,
229 })
230 }
231}
232
233impl ToFieldValue for Project {
234 fn to_field_value(&self) -> FieldValue {
235 match self.to_json() {
236 Ok(json_str) => FieldValue::from_json_object(json_str),
237 Err(_) => FieldValue::from_string("serialization_error".to_string()),
238 }
239 }
240}
241
242impl FromFieldValue for Project {
243 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
244 // Try JSON object first
245 if let Ok(json_data) = value.as_json_object() {
246 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
247 field: field_name.to_string(),
248 message: format!("Failed to deserialize Project from JSON: {}", e),
249 });
250 }
251
252 // Try binary object
253 if let Ok(binary_data) = value.as_binary_object() {
254 return Self::from_binary(binary_data).map_err(|e| {
255 SerializationError::ValidationFailed {
256 field: field_name.to_string(),
257 message: format!("Failed to deserialize Project from binary: {}", e),
258 }
259 });
260 }
261
262 Err(SerializationError::ValidationFailed {
263 field: field_name.to_string(),
264 message: format!(
265 "Expected JsonObject or BinaryObject for Project, found {}",
266 value.type_name()
267 ),
268 })
269 }
270}
271
272/// Project status enumeration
273#[derive(Debug, Clone, PartialEq)]
274pub enum ProjectStatus {
275 Planning,
276 InProgress,
277 OnHold,
278 Completed,
279 Cancelled,
280}
281
282impl ToFieldValue for ProjectStatus {
283 fn to_field_value(&self) -> FieldValue {
284 let status_str = match self {
285 ProjectStatus::Planning => "planning",
286 ProjectStatus::InProgress => "in_progress",
287 ProjectStatus::OnHold => "on_hold",
288 ProjectStatus::Completed => "completed",
289 ProjectStatus::Cancelled => "cancelled",
290 };
291 FieldValue::from_string(status_str.to_string())
292 }
293}
294
295impl FromFieldValue for ProjectStatus {
296 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
297 match value {
298 FieldValue::String(s) => match s.as_str() {
299 "planning" => Ok(ProjectStatus::Planning),
300 "in_progress" => Ok(ProjectStatus::InProgress),
301 "on_hold" => Ok(ProjectStatus::OnHold),
302 "completed" => Ok(ProjectStatus::Completed),
303 "cancelled" => Ok(ProjectStatus::Cancelled),
304 _ => Err(SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Unknown project status: {}", s),
307 }),
308 },
309 _ => Err(SerializationError::ValidationFailed {
310 field: field_name.to_string(),
311 message: format!(
312 "Expected String for ProjectStatus, found {}",
313 value.type_name()
314 ),
315 }),
316 }
317 }
318}
319
320/// Project milestone struct
321#[derive(Debug, Clone, PartialEq)]
322pub struct Milestone {
323 pub name: String,
324 pub description: String,
325 pub due_date: String, // Simplified as string for this example
326 pub is_completed: bool,
327 pub progress_percentage: f32,
328 pub dependencies: Vec<String>,
329}
330
331impl StructSerializable for Milestone {
332 fn to_serializer(&self) -> StructSerializer {
333 StructSerializer::new()
334 .field("name", &self.name)
335 .field("description", &self.description)
336 .field("due_date", &self.due_date)
337 .field("is_completed", &self.is_completed)
338 .field("progress_percentage", &self.progress_percentage)
339 .field("dependencies", &self.dependencies)
340 }
341
342 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
343 let name = deserializer.field("name")?;
344 let description = deserializer.field("description")?;
345 let due_date = deserializer.field("due_date")?;
346 let is_completed = deserializer.field("is_completed")?;
347 let progress_percentage = deserializer.field("progress_percentage")?;
348 let dependencies = deserializer.field("dependencies")?;
349
350 Ok(Milestone {
351 name,
352 description,
353 due_date,
354 is_completed,
355 progress_percentage,
356 dependencies,
357 })
358 }
359}
360
361impl ToFieldValue for Milestone {
362 fn to_field_value(&self) -> FieldValue {
363 match self.to_json() {
364 Ok(json_str) => FieldValue::from_json_object(json_str),
365 Err(_) => FieldValue::from_string("serialization_error".to_string()),
366 }
367 }
368}
369
370impl FromFieldValue for Milestone {
371 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
372 // Try JSON object first
373 if let Ok(json_data) = value.as_json_object() {
374 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
375 field: field_name.to_string(),
376 message: format!("Failed to deserialize Milestone from JSON: {}", e),
377 });
378 }
379
380 // Try binary object
381 if let Ok(binary_data) = value.as_binary_object() {
382 return Self::from_binary(binary_data).map_err(|e| {
383 SerializationError::ValidationFailed {
384 field: field_name.to_string(),
385 message: format!("Failed to deserialize Milestone from binary: {}", e),
386 }
387 });
388 }
389
390 Err(SerializationError::ValidationFailed {
391 field: field_name.to_string(),
392 message: format!(
393 "Expected JsonObject or BinaryObject for Milestone, found {}",
394 value.type_name()
395 ),
396 })
397 }
398}
399
400/// Company struct with basic collections and nesting
401#[derive(Debug, Clone, PartialEq)]
402pub struct Company {
403 pub name: String,
404 pub founded_year: i32,
405 pub headquarters_city: String,
406 pub headquarters_state: String,
407 pub employee_count: usize,
408 pub department_names: Vec<String>,
409 pub active_project_names: Vec<String>,
410 pub company_metadata: HashMap<String, String>,
411}
412
413impl StructSerializable for Company {
414 fn to_serializer(&self) -> StructSerializer {
415 StructSerializer::new()
416 .field("name", &self.name)
417 .field("founded_year", &self.founded_year)
418 .field("headquarters_city", &self.headquarters_city)
419 .field("headquarters_state", &self.headquarters_state)
420 .field("employee_count", &self.employee_count)
421 .field("department_names", &self.department_names)
422 .field("active_project_names", &self.active_project_names)
423 .field("company_metadata", &self.company_metadata)
424 }
425
426 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
427 let name = deserializer.field("name")?;
428 let founded_year = deserializer.field("founded_year")?;
429 let headquarters_city = deserializer.field("headquarters_city")?;
430 let headquarters_state = deserializer.field("headquarters_state")?;
431 let employee_count = deserializer.field("employee_count")?;
432 let department_names = deserializer.field("department_names")?;
433 let active_project_names = deserializer.field("active_project_names")?;
434 let company_metadata = deserializer.field("company_metadata")?;
435
436 Ok(Company {
437 name,
438 founded_year,
439 headquarters_city,
440 headquarters_state,
441 employee_count,
442 department_names,
443 active_project_names,
444 company_metadata,
445 })
446 }
447}
448
449impl ToFieldValue for Company {
450 fn to_field_value(&self) -> FieldValue {
451 match self.to_json() {
452 Ok(json_str) => FieldValue::from_json_object(json_str),
453 Err(_) => FieldValue::from_string("serialization_error".to_string()),
454 }
455 }
456}
457
458impl FromFieldValue for Company {
459 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
460 // Try JSON object first
461 if let Ok(json_data) = value.as_json_object() {
462 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
463 field: field_name.to_string(),
464 message: format!("Failed to deserialize Company from JSON: {}", e),
465 });
466 }
467
468 // Try binary object
469 if let Ok(binary_data) = value.as_binary_object() {
470 return Self::from_binary(binary_data).map_err(|e| {
471 SerializationError::ValidationFailed {
472 field: field_name.to_string(),
473 message: format!("Failed to deserialize Company from binary: {}", e),
474 }
475 });
476 }
477
478 Err(SerializationError::ValidationFailed {
479 field: field_name.to_string(),
480 message: format!(
481 "Expected JsonObject or BinaryObject for Company, found {}",
482 value.type_name()
483 ),
484 })
485 }
486}
487
488/// Department struct
489#[derive(Debug, Clone, PartialEq)]
490pub struct Department {
491 pub name: String,
492 pub manager: String,
493 pub employee_count: u32,
494 pub budget: f64,
495 pub office_locations: Vec<Address>,
496}
497
498impl StructSerializable for Department {
499 fn to_serializer(&self) -> StructSerializer {
500 StructSerializer::new()
501 .field("name", &self.name)
502 .field("manager", &self.manager)
503 .field("employee_count", &self.employee_count)
504 .field("budget", &self.budget)
505 .field("office_locations", &self.office_locations)
506 }
507
508 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
509 let name = deserializer.field("name")?;
510 let manager = deserializer.field("manager")?;
511 let employee_count = deserializer.field("employee_count")?;
512 let budget = deserializer.field("budget")?;
513 let office_locations = deserializer.field("office_locations")?;
514
515 Ok(Department {
516 name,
517 manager,
518 employee_count,
519 budget,
520 office_locations,
521 })
522 }
523}
524
525impl ToFieldValue for Department {
526 fn to_field_value(&self) -> FieldValue {
527 match self.to_json() {
528 Ok(json_str) => FieldValue::from_json_object(json_str),
529 Err(_) => FieldValue::from_string("serialization_error".to_string()),
530 }
531 }78 fn to_field_value(&self) -> FieldValue {
79 // Convert to JSON and then parse as FieldValue for nested object handling
80 match self.to_json() {
81 Ok(json_str) => {
82 // For examples, we'll serialize as JSON string for simplicity
83 FieldValue::from_json_object(json_str)
84 }
85 Err(_) => FieldValue::from_string("serialization_error".to_string()),
86 }
87 }
88}
89
90impl FromFieldValue for UserProfile {
91 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
92 // Try JSON object first
93 if let Ok(json_data) = value.as_json_object() {
94 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
95 field: field_name.to_string(),
96 message: format!("Failed to deserialize UserProfile from JSON: {}", e),
97 });
98 }
99
100 // Try binary object
101 if let Ok(binary_data) = value.as_binary_object() {
102 return Self::from_binary(binary_data).map_err(|e| {
103 SerializationError::ValidationFailed {
104 field: field_name.to_string(),
105 message: format!("Failed to deserialize UserProfile from binary: {}", e),
106 }
107 });
108 }
109
110 Err(SerializationError::ValidationFailed {
111 field: field_name.to_string(),
112 message: format!(
113 "Expected JsonObject or BinaryObject for UserProfile, found {}",
114 value.type_name()
115 ),
116 })
117 }
118}
119
120/// Application settings struct with optional fields and collections
121#[derive(Debug, Clone, PartialEq)]
122pub struct AppSettings {
123 pub app_name: String,
124 pub version: String,
125 pub debug_mode: bool,
126 pub max_connections: u32,
127 pub timeout_seconds: f32,
128 pub features: Vec<String>,
129 pub environment_vars: HashMap<String, String>,
130 pub optional_database_url: Option<String>,
131}
132
133impl StructSerializable for AppSettings {
134 fn to_serializer(&self) -> StructSerializer {
135 StructSerializer::new()
136 .field("app_name", &self.app_name)
137 .field("version", &self.version)
138 .field("debug_mode", &self.debug_mode)
139 .field("max_connections", &self.max_connections)
140 .field("timeout_seconds", &self.timeout_seconds)
141 .field("features", &self.features)
142 .field("environment_vars", &self.environment_vars)
143 .field("optional_database_url", &self.optional_database_url)
144 }
145
146 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
147 let app_name = deserializer.field("app_name")?;
148 let version = deserializer.field("version")?;
149 let debug_mode = deserializer.field("debug_mode")?;
150 let max_connections = deserializer.field("max_connections")?;
151 let timeout_seconds = deserializer.field("timeout_seconds")?;
152 let features = deserializer.field("features")?;
153 let environment_vars = deserializer.field("environment_vars")?;
154 let optional_database_url = deserializer.field("optional_database_url")?;
155
156 Ok(AppSettings {
157 app_name,
158 version,
159 debug_mode,
160 max_connections,
161 timeout_seconds,
162 features,
163 environment_vars,
164 optional_database_url,
165 })
166 }
167}
168
169impl ToFieldValue for AppSettings {
170 fn to_field_value(&self) -> FieldValue {
171 // Convert to JSON and then parse as FieldValue for nested object handling
172 match self.to_json() {
173 Ok(json_str) => FieldValue::from_json_object(json_str),
174 Err(_) => FieldValue::from_string("serialization_error".to_string()),
175 }
176 }Sourcepub fn from_string_slice(value: &str) -> Self
pub fn from_string_slice(value: &str) -> Self
Sourcepub fn from_bytes(value: Vec<u8>) -> Self
pub fn from_bytes(value: Vec<u8>) -> Self
Sourcepub fn from_json_object(json: String) -> Self
pub fn from_json_object(json: String) -> Self
Creates a JSON object field value
§Arguments
json- JSON string representation of the object
§Returns
A FieldValue::JsonObject variant containing the JSON string
Examples found in repository?
85 fn to_field_value(&self) -> FieldValue {
86 match self.to_json() {
87 Ok(json_str) => FieldValue::from_json_object(json_str),
88 Err(_) => FieldValue::from_string("serialization_error".to_string()),
89 }
90 }
91}
92
93impl FromFieldValue for VersionedData {
94 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
95 // Try JSON object first
96 if let Ok(json_data) = value.as_json_object() {
97 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
98 field: field_name.to_string(),
99 message: format!("Failed to deserialize VersionedData from JSON: {}", e),
100 });
101 }
102
103 // Try binary object
104 if let Ok(binary_data) = value.as_binary_object() {
105 return Self::from_binary(binary_data).map_err(|e| {
106 SerializationError::ValidationFailed {
107 field: field_name.to_string(),
108 message: format!("Failed to deserialize VersionedData from binary: {}", e),
109 }
110 });
111 }
112
113 Err(SerializationError::ValidationFailed {
114 field: field_name.to_string(),
115 message: format!(
116 "Expected JsonObject or BinaryObject for VersionedData, found {}",
117 value.type_name()
118 ),
119 })
120 }
121}
122
123/// Validated user input with constraints
124#[derive(Debug, Clone, PartialEq)]
125pub struct ValidatedUserInput {
126 pub username: String,
127 pub email: String,
128 pub age: u16,
129 pub preferences: HashMap<String, String>,
130}
131
132impl StructSerializable for ValidatedUserInput {
133 fn to_serializer(&self) -> StructSerializer {
134 StructSerializer::new()
135 .field("username", &self.username)
136 .field("email", &self.email)
137 .field("age", &self.age)
138 .field("preferences", &self.preferences)
139 }
140
141 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
142 let username: String = deserializer.field("username")?;
143 let email: String = deserializer.field("email")?;
144 let age: u16 = deserializer.field("age")?;
145 let preferences: HashMap<String, String> = deserializer.field("preferences")?;
146
147 // Validate username
148 if username.is_empty() || username.len() > 50 {
149 return Err(SerializationError::ValidationFailed {
150 field: "username".to_string(),
151 message: "Username must be 1-50 characters long".to_string(),
152 });
153 }
154
155 if !username
156 .chars()
157 .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
158 {
159 return Err(SerializationError::ValidationFailed {
160 field: "username".to_string(),
161 message:
162 "Username can only contain alphanumeric characters, underscores, and hyphens"
163 .to_string(),
164 });
165 }
166
167 // Validate email (basic check)
168 if !email.contains('@') || !email.contains('.') || email.len() < 5 {
169 return Err(SerializationError::ValidationFailed {
170 field: "email".to_string(),
171 message: "Invalid email format".to_string(),
172 });
173 }
174
175 // Validate age
176 if !(13..=120).contains(&age) {
177 return Err(SerializationError::ValidationFailed {
178 field: "age".to_string(),
179 message: "Age must be between 13 and 120".to_string(),
180 });
181 }
182
183 // Validate preferences
184 if preferences.len() > 20 {
185 return Err(SerializationError::ValidationFailed {
186 field: "preferences".to_string(),
187 message: "Too many preferences (maximum 20)".to_string(),
188 });
189 }
190
191 for (key, value) in &preferences {
192 if key.len() > 50 || value.len() > 200 {
193 return Err(SerializationError::ValidationFailed {
194 field: "preferences".to_string(),
195 message: format!("Preference key/value too long: {}", key),
196 });
197 }
198 }
199
200 Ok(ValidatedUserInput {
201 username,
202 email,
203 age,
204 preferences,
205 })
206 }
207}
208
209impl ToFieldValue for ValidatedUserInput {
210 fn to_field_value(&self) -> FieldValue {
211 match self.to_json() {
212 Ok(json_str) => FieldValue::from_json_object(json_str),
213 Err(_) => FieldValue::from_string("serialization_error".to_string()),
214 }
215 }
216}
217
218impl FromFieldValue for ValidatedUserInput {
219 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
220 // Try JSON object first
221 if let Ok(json_data) = value.as_json_object() {
222 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
223 field: field_name.to_string(),
224 message: format!("Failed to deserialize ValidatedUserInput from JSON: {}", e),
225 });
226 }
227
228 // Try binary object
229 if let Ok(binary_data) = value.as_binary_object() {
230 return Self::from_binary(binary_data).map_err(|e| {
231 SerializationError::ValidationFailed {
232 field: field_name.to_string(),
233 message: format!(
234 "Failed to deserialize ValidatedUserInput from binary: {}",
235 e
236 ),
237 }
238 });
239 }
240
241 Err(SerializationError::ValidationFailed {
242 field: field_name.to_string(),
243 message: format!(
244 "Expected JsonObject or BinaryObject for ValidatedUserInput, found {}",
245 value.type_name()
246 ),
247 })
248 }
249}
250
251/// Recovery helper for handling partial data
252#[derive(Debug, Clone, PartialEq)]
253pub struct RecoverableData {
254 pub critical_field: String,
255 pub important_field: Option<String>,
256 pub optional_field: Option<String>,
257 pub metadata: HashMap<String, String>,
258}
259
260impl StructSerializable for RecoverableData {
261 fn to_serializer(&self) -> StructSerializer {
262 StructSerializer::new()
263 .field("critical_field", &self.critical_field)
264 .field("important_field", &self.important_field)
265 .field("optional_field", &self.optional_field)
266 .field("metadata", &self.metadata)
267 }
268
269 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
270 // Critical field - must exist
271 let critical_field = deserializer.field("critical_field")?;
272
273 // Important field - try to recover if missing
274 let important_field = deserializer.field_optional("important_field")?;
275
276 // Optional field - graceful fallback
277 let optional_field = deserializer.field_optional("optional_field")?;
278
279 // Metadata - recover what we can
280 let metadata = deserializer.field_or("metadata", HashMap::new())?;
281
282 Ok(RecoverableData {
283 critical_field,
284 important_field,
285 optional_field,
286 metadata,
287 })
288 }
289}
290
291impl ToFieldValue for RecoverableData {
292 fn to_field_value(&self) -> FieldValue {
293 match self.to_json() {
294 Ok(json_str) => FieldValue::from_json_object(json_str),
295 Err(_) => FieldValue::from_string("serialization_error".to_string()),
296 }
297 }More examples
78 fn to_field_value(&self) -> FieldValue {
79 match self.to_json() {
80 Ok(json_str) => FieldValue::from_json_object(json_str),
81 Err(_) => FieldValue::from_string("serialization_error".to_string()),
82 }
83 }
84}
85
86impl FromFieldValue for PerformanceMetrics {
87 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
88 // Try JSON object first
89 if let Ok(json_data) = value.as_json_object() {
90 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
91 field: field_name.to_string(),
92 message: format!("Failed to deserialize PerformanceMetrics from JSON: {}", e),
93 });
94 }
95
96 // Try binary object
97 if let Ok(binary_data) = value.as_binary_object() {
98 return Self::from_binary(binary_data).map_err(|e| {
99 SerializationError::ValidationFailed {
100 field: field_name.to_string(),
101 message: format!(
102 "Failed to deserialize PerformanceMetrics from binary: {}",
103 e
104 ),
105 }
106 });
107 }
108
109 Err(SerializationError::ValidationFailed {
110 field: field_name.to_string(),
111 message: format!(
112 "Expected JsonObject or BinaryObject for PerformanceMetrics, found {}",
113 value.type_name()
114 ),
115 })
116 }
117}
118
119/// Large dataset for performance testing
120#[derive(Debug, Clone, PartialEq)]
121pub struct LargeDataset {
122 pub name: String,
123 pub values: Vec<f32>, // Changed from f64 to f32 (supported)
124 pub labels: Vec<String>,
125 pub feature_count: usize, // Simplified from Vec<Vec<f32>> to just a count
126 pub feature_dimension: usize, // Store dimensions separately
127 pub metadata: HashMap<String, String>,
128 pub timestamp_count: usize, // Simplified from Vec<u64> to just count
129}
130
131impl StructSerializable for LargeDataset {
132 fn to_serializer(&self) -> StructSerializer {
133 StructSerializer::new()
134 .field("name", &self.name)
135 .field("values", &self.values)
136 .field("labels", &self.labels)
137 .field("feature_count", &self.feature_count)
138 .field("feature_dimension", &self.feature_dimension)
139 .field("metadata", &self.metadata)
140 .field("timestamp_count", &self.timestamp_count)
141 }
142
143 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
144 let name = deserializer.field("name")?;
145 let values = deserializer.field("values")?;
146 let labels = deserializer.field("labels")?;
147 let feature_count = deserializer.field("feature_count")?;
148 let feature_dimension = deserializer.field("feature_dimension")?;
149 let metadata = deserializer.field("metadata")?;
150 let timestamp_count = deserializer.field("timestamp_count")?;
151
152 Ok(LargeDataset {
153 name,
154 values,
155 labels,
156 feature_count,
157 feature_dimension,
158 metadata,
159 timestamp_count,
160 })
161 }
162}
163
164impl ToFieldValue for LargeDataset {
165 fn to_field_value(&self) -> FieldValue {
166 match self.to_json() {
167 Ok(json_str) => FieldValue::from_json_object(json_str),
168 Err(_) => FieldValue::from_string("serialization_error".to_string()),
169 }
170 }
171}
172
173impl FromFieldValue for LargeDataset {
174 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
175 // Try JSON object first
176 if let Ok(json_data) = value.as_json_object() {
177 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
178 field: field_name.to_string(),
179 message: format!("Failed to deserialize LargeDataset from JSON: {}", e),
180 });
181 }
182
183 // Try binary object
184 if let Ok(binary_data) = value.as_binary_object() {
185 return Self::from_binary(binary_data).map_err(|e| {
186 SerializationError::ValidationFailed {
187 field: field_name.to_string(),
188 message: format!("Failed to deserialize LargeDataset from binary: {}", e),
189 }
190 });
191 }
192
193 Err(SerializationError::ValidationFailed {
194 field: field_name.to_string(),
195 message: format!(
196 "Expected JsonObject or BinaryObject for LargeDataset, found {}",
197 value.type_name()
198 ),
199 })
200 }
201}
202
203/// Configuration data (typical JSON use case)
204#[derive(Debug, Clone, PartialEq)]
205pub struct Configuration {
206 pub version: String,
207 pub debug_enabled: bool,
208 pub log_level: String,
209 pub database_settings: HashMap<String, String>,
210 pub feature_flags_enabled: bool, // Simplified from HashMap<String, bool>
211 pub max_connections: f32, // Simplified from HashMap<String, f64>
212 pub timeout_seconds: f32,
213}
214
215impl StructSerializable for Configuration {
216 fn to_serializer(&self) -> StructSerializer {
217 StructSerializer::new()
218 .field("version", &self.version)
219 .field("debug_enabled", &self.debug_enabled)
220 .field("log_level", &self.log_level)
221 .field("database_settings", &self.database_settings)
222 .field("feature_flags_enabled", &self.feature_flags_enabled)
223 .field("max_connections", &self.max_connections)
224 .field("timeout_seconds", &self.timeout_seconds)
225 }
226
227 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
228 let version = deserializer.field("version")?;
229 let debug_enabled = deserializer.field("debug_enabled")?;
230 let log_level = deserializer.field("log_level")?;
231 let database_settings = deserializer.field("database_settings")?;
232 let feature_flags_enabled = deserializer.field("feature_flags_enabled")?;
233 let max_connections = deserializer.field("max_connections")?;
234 let timeout_seconds = deserializer.field("timeout_seconds")?;
235
236 Ok(Configuration {
237 version,
238 debug_enabled,
239 log_level,
240 database_settings,
241 feature_flags_enabled,
242 max_connections,
243 timeout_seconds,
244 })
245 }
246}
247
248impl ToFieldValue for Configuration {
249 fn to_field_value(&self) -> FieldValue {
250 match self.to_json() {
251 Ok(json_str) => FieldValue::from_json_object(json_str),
252 Err(_) => FieldValue::from_string("serialization_error".to_string()),
253 }
254 }74 fn to_field_value(&self) -> FieldValue {
75 match self.to_json() {
76 Ok(json_str) => FieldValue::from_json_object(json_str),
77 Err(_) => FieldValue::from_string("serialization_error".to_string()),
78 }
79 }
80}
81
82impl FromFieldValue for ContactInfo {
83 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
84 // Try JSON object first
85 if let Ok(json_data) = value.as_json_object() {
86 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
87 field: field_name.to_string(),
88 message: format!("Failed to deserialize ContactInfo from JSON: {}", e),
89 });
90 }
91
92 // Try binary object
93 if let Ok(binary_data) = value.as_binary_object() {
94 return Self::from_binary(binary_data).map_err(|e| {
95 SerializationError::ValidationFailed {
96 field: field_name.to_string(),
97 message: format!("Failed to deserialize ContactInfo from binary: {}", e),
98 }
99 });
100 }
101
102 Err(SerializationError::ValidationFailed {
103 field: field_name.to_string(),
104 message: format!(
105 "Expected JsonObject or BinaryObject for ContactInfo, found {}",
106 value.type_name()
107 ),
108 })
109 }
110}
111
112/// Address struct
113#[derive(Debug, Clone, PartialEq)]
114pub struct Address {
115 pub street: String,
116 pub city: String,
117 pub state: String,
118 pub postal_code: String,
119 pub country: String,
120}
121
122impl StructSerializable for Address {
123 fn to_serializer(&self) -> StructSerializer {
124 StructSerializer::new()
125 .field("street", &self.street)
126 .field("city", &self.city)
127 .field("state", &self.state)
128 .field("postal_code", &self.postal_code)
129 .field("country", &self.country)
130 }
131
132 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
133 let street = deserializer.field("street")?;
134 let city = deserializer.field("city")?;
135 let state = deserializer.field("state")?;
136 let postal_code = deserializer.field("postal_code")?;
137 let country = deserializer.field("country")?;
138
139 Ok(Address {
140 street,
141 city,
142 state,
143 postal_code,
144 country,
145 })
146 }
147}
148
149impl ToFieldValue for Address {
150 fn to_field_value(&self) -> FieldValue {
151 match self.to_json() {
152 Ok(json_str) => FieldValue::from_json_object(json_str),
153 Err(_) => FieldValue::from_string("serialization_error".to_string()),
154 }
155 }
156}
157
158impl FromFieldValue for Address {
159 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
160 // Try JSON object first
161 if let Ok(json_data) = value.as_json_object() {
162 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
163 field: field_name.to_string(),
164 message: format!("Failed to deserialize Address from JSON: {}", e),
165 });
166 }
167
168 // Try binary object
169 if let Ok(binary_data) = value.as_binary_object() {
170 return Self::from_binary(binary_data).map_err(|e| {
171 SerializationError::ValidationFailed {
172 field: field_name.to_string(),
173 message: format!("Failed to deserialize Address from binary: {}", e),
174 }
175 });
176 }
177
178 Err(SerializationError::ValidationFailed {
179 field: field_name.to_string(),
180 message: format!(
181 "Expected JsonObject or BinaryObject for Address, found {}",
182 value.type_name()
183 ),
184 })
185 }
186}
187
188/// Project information struct
189#[derive(Debug, Clone, PartialEq)]
190pub struct Project {
191 pub name: String,
192 pub description: String,
193 pub status: ProjectStatus,
194 pub budget: f64,
195 pub team_members: Vec<String>,
196 pub milestones: Vec<Milestone>,
197 pub metadata: HashMap<String, String>,
198}
199
200impl StructSerializable for Project {
201 fn to_serializer(&self) -> StructSerializer {
202 StructSerializer::new()
203 .field("name", &self.name)
204 .field("description", &self.description)
205 .field("status", &self.status)
206 .field("budget", &self.budget)
207 .field("team_members", &self.team_members)
208 .field("milestones", &self.milestones)
209 .field("metadata", &self.metadata)
210 }
211
212 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
213 let name = deserializer.field("name")?;
214 let description = deserializer.field("description")?;
215 let status = deserializer.field("status")?;
216 let budget = deserializer.field("budget")?;
217 let team_members = deserializer.field("team_members")?;
218 let milestones = deserializer.field("milestones")?;
219 let metadata = deserializer.field("metadata")?;
220
221 Ok(Project {
222 name,
223 description,
224 status,
225 budget,
226 team_members,
227 milestones,
228 metadata,
229 })
230 }
231}
232
233impl ToFieldValue for Project {
234 fn to_field_value(&self) -> FieldValue {
235 match self.to_json() {
236 Ok(json_str) => FieldValue::from_json_object(json_str),
237 Err(_) => FieldValue::from_string("serialization_error".to_string()),
238 }
239 }
240}
241
242impl FromFieldValue for Project {
243 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
244 // Try JSON object first
245 if let Ok(json_data) = value.as_json_object() {
246 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
247 field: field_name.to_string(),
248 message: format!("Failed to deserialize Project from JSON: {}", e),
249 });
250 }
251
252 // Try binary object
253 if let Ok(binary_data) = value.as_binary_object() {
254 return Self::from_binary(binary_data).map_err(|e| {
255 SerializationError::ValidationFailed {
256 field: field_name.to_string(),
257 message: format!("Failed to deserialize Project from binary: {}", e),
258 }
259 });
260 }
261
262 Err(SerializationError::ValidationFailed {
263 field: field_name.to_string(),
264 message: format!(
265 "Expected JsonObject or BinaryObject for Project, found {}",
266 value.type_name()
267 ),
268 })
269 }
270}
271
272/// Project status enumeration
273#[derive(Debug, Clone, PartialEq)]
274pub enum ProjectStatus {
275 Planning,
276 InProgress,
277 OnHold,
278 Completed,
279 Cancelled,
280}
281
282impl ToFieldValue for ProjectStatus {
283 fn to_field_value(&self) -> FieldValue {
284 let status_str = match self {
285 ProjectStatus::Planning => "planning",
286 ProjectStatus::InProgress => "in_progress",
287 ProjectStatus::OnHold => "on_hold",
288 ProjectStatus::Completed => "completed",
289 ProjectStatus::Cancelled => "cancelled",
290 };
291 FieldValue::from_string(status_str.to_string())
292 }
293}
294
295impl FromFieldValue for ProjectStatus {
296 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
297 match value {
298 FieldValue::String(s) => match s.as_str() {
299 "planning" => Ok(ProjectStatus::Planning),
300 "in_progress" => Ok(ProjectStatus::InProgress),
301 "on_hold" => Ok(ProjectStatus::OnHold),
302 "completed" => Ok(ProjectStatus::Completed),
303 "cancelled" => Ok(ProjectStatus::Cancelled),
304 _ => Err(SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Unknown project status: {}", s),
307 }),
308 },
309 _ => Err(SerializationError::ValidationFailed {
310 field: field_name.to_string(),
311 message: format!(
312 "Expected String for ProjectStatus, found {}",
313 value.type_name()
314 ),
315 }),
316 }
317 }
318}
319
320/// Project milestone struct
321#[derive(Debug, Clone, PartialEq)]
322pub struct Milestone {
323 pub name: String,
324 pub description: String,
325 pub due_date: String, // Simplified as string for this example
326 pub is_completed: bool,
327 pub progress_percentage: f32,
328 pub dependencies: Vec<String>,
329}
330
331impl StructSerializable for Milestone {
332 fn to_serializer(&self) -> StructSerializer {
333 StructSerializer::new()
334 .field("name", &self.name)
335 .field("description", &self.description)
336 .field("due_date", &self.due_date)
337 .field("is_completed", &self.is_completed)
338 .field("progress_percentage", &self.progress_percentage)
339 .field("dependencies", &self.dependencies)
340 }
341
342 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
343 let name = deserializer.field("name")?;
344 let description = deserializer.field("description")?;
345 let due_date = deserializer.field("due_date")?;
346 let is_completed = deserializer.field("is_completed")?;
347 let progress_percentage = deserializer.field("progress_percentage")?;
348 let dependencies = deserializer.field("dependencies")?;
349
350 Ok(Milestone {
351 name,
352 description,
353 due_date,
354 is_completed,
355 progress_percentage,
356 dependencies,
357 })
358 }
359}
360
361impl ToFieldValue for Milestone {
362 fn to_field_value(&self) -> FieldValue {
363 match self.to_json() {
364 Ok(json_str) => FieldValue::from_json_object(json_str),
365 Err(_) => FieldValue::from_string("serialization_error".to_string()),
366 }
367 }
368}
369
370impl FromFieldValue for Milestone {
371 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
372 // Try JSON object first
373 if let Ok(json_data) = value.as_json_object() {
374 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
375 field: field_name.to_string(),
376 message: format!("Failed to deserialize Milestone from JSON: {}", e),
377 });
378 }
379
380 // Try binary object
381 if let Ok(binary_data) = value.as_binary_object() {
382 return Self::from_binary(binary_data).map_err(|e| {
383 SerializationError::ValidationFailed {
384 field: field_name.to_string(),
385 message: format!("Failed to deserialize Milestone from binary: {}", e),
386 }
387 });
388 }
389
390 Err(SerializationError::ValidationFailed {
391 field: field_name.to_string(),
392 message: format!(
393 "Expected JsonObject or BinaryObject for Milestone, found {}",
394 value.type_name()
395 ),
396 })
397 }
398}
399
400/// Company struct with basic collections and nesting
401#[derive(Debug, Clone, PartialEq)]
402pub struct Company {
403 pub name: String,
404 pub founded_year: i32,
405 pub headquarters_city: String,
406 pub headquarters_state: String,
407 pub employee_count: usize,
408 pub department_names: Vec<String>,
409 pub active_project_names: Vec<String>,
410 pub company_metadata: HashMap<String, String>,
411}
412
413impl StructSerializable for Company {
414 fn to_serializer(&self) -> StructSerializer {
415 StructSerializer::new()
416 .field("name", &self.name)
417 .field("founded_year", &self.founded_year)
418 .field("headquarters_city", &self.headquarters_city)
419 .field("headquarters_state", &self.headquarters_state)
420 .field("employee_count", &self.employee_count)
421 .field("department_names", &self.department_names)
422 .field("active_project_names", &self.active_project_names)
423 .field("company_metadata", &self.company_metadata)
424 }
425
426 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
427 let name = deserializer.field("name")?;
428 let founded_year = deserializer.field("founded_year")?;
429 let headquarters_city = deserializer.field("headquarters_city")?;
430 let headquarters_state = deserializer.field("headquarters_state")?;
431 let employee_count = deserializer.field("employee_count")?;
432 let department_names = deserializer.field("department_names")?;
433 let active_project_names = deserializer.field("active_project_names")?;
434 let company_metadata = deserializer.field("company_metadata")?;
435
436 Ok(Company {
437 name,
438 founded_year,
439 headquarters_city,
440 headquarters_state,
441 employee_count,
442 department_names,
443 active_project_names,
444 company_metadata,
445 })
446 }
447}
448
449impl ToFieldValue for Company {
450 fn to_field_value(&self) -> FieldValue {
451 match self.to_json() {
452 Ok(json_str) => FieldValue::from_json_object(json_str),
453 Err(_) => FieldValue::from_string("serialization_error".to_string()),
454 }
455 }
456}
457
458impl FromFieldValue for Company {
459 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
460 // Try JSON object first
461 if let Ok(json_data) = value.as_json_object() {
462 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
463 field: field_name.to_string(),
464 message: format!("Failed to deserialize Company from JSON: {}", e),
465 });
466 }
467
468 // Try binary object
469 if let Ok(binary_data) = value.as_binary_object() {
470 return Self::from_binary(binary_data).map_err(|e| {
471 SerializationError::ValidationFailed {
472 field: field_name.to_string(),
473 message: format!("Failed to deserialize Company from binary: {}", e),
474 }
475 });
476 }
477
478 Err(SerializationError::ValidationFailed {
479 field: field_name.to_string(),
480 message: format!(
481 "Expected JsonObject or BinaryObject for Company, found {}",
482 value.type_name()
483 ),
484 })
485 }
486}
487
488/// Department struct
489#[derive(Debug, Clone, PartialEq)]
490pub struct Department {
491 pub name: String,
492 pub manager: String,
493 pub employee_count: u32,
494 pub budget: f64,
495 pub office_locations: Vec<Address>,
496}
497
498impl StructSerializable for Department {
499 fn to_serializer(&self) -> StructSerializer {
500 StructSerializer::new()
501 .field("name", &self.name)
502 .field("manager", &self.manager)
503 .field("employee_count", &self.employee_count)
504 .field("budget", &self.budget)
505 .field("office_locations", &self.office_locations)
506 }
507
508 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
509 let name = deserializer.field("name")?;
510 let manager = deserializer.field("manager")?;
511 let employee_count = deserializer.field("employee_count")?;
512 let budget = deserializer.field("budget")?;
513 let office_locations = deserializer.field("office_locations")?;
514
515 Ok(Department {
516 name,
517 manager,
518 employee_count,
519 budget,
520 office_locations,
521 })
522 }
523}
524
525impl ToFieldValue for Department {
526 fn to_field_value(&self) -> FieldValue {
527 match self.to_json() {
528 Ok(json_str) => FieldValue::from_json_object(json_str),
529 Err(_) => FieldValue::from_string("serialization_error".to_string()),
530 }
531 }78 fn to_field_value(&self) -> FieldValue {
79 // Convert to JSON and then parse as FieldValue for nested object handling
80 match self.to_json() {
81 Ok(json_str) => {
82 // For examples, we'll serialize as JSON string for simplicity
83 FieldValue::from_json_object(json_str)
84 }
85 Err(_) => FieldValue::from_string("serialization_error".to_string()),
86 }
87 }
88}
89
90impl FromFieldValue for UserProfile {
91 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
92 // Try JSON object first
93 if let Ok(json_data) = value.as_json_object() {
94 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
95 field: field_name.to_string(),
96 message: format!("Failed to deserialize UserProfile from JSON: {}", e),
97 });
98 }
99
100 // Try binary object
101 if let Ok(binary_data) = value.as_binary_object() {
102 return Self::from_binary(binary_data).map_err(|e| {
103 SerializationError::ValidationFailed {
104 field: field_name.to_string(),
105 message: format!("Failed to deserialize UserProfile from binary: {}", e),
106 }
107 });
108 }
109
110 Err(SerializationError::ValidationFailed {
111 field: field_name.to_string(),
112 message: format!(
113 "Expected JsonObject or BinaryObject for UserProfile, found {}",
114 value.type_name()
115 ),
116 })
117 }
118}
119
120/// Application settings struct with optional fields and collections
121#[derive(Debug, Clone, PartialEq)]
122pub struct AppSettings {
123 pub app_name: String,
124 pub version: String,
125 pub debug_mode: bool,
126 pub max_connections: u32,
127 pub timeout_seconds: f32,
128 pub features: Vec<String>,
129 pub environment_vars: HashMap<String, String>,
130 pub optional_database_url: Option<String>,
131}
132
133impl StructSerializable for AppSettings {
134 fn to_serializer(&self) -> StructSerializer {
135 StructSerializer::new()
136 .field("app_name", &self.app_name)
137 .field("version", &self.version)
138 .field("debug_mode", &self.debug_mode)
139 .field("max_connections", &self.max_connections)
140 .field("timeout_seconds", &self.timeout_seconds)
141 .field("features", &self.features)
142 .field("environment_vars", &self.environment_vars)
143 .field("optional_database_url", &self.optional_database_url)
144 }
145
146 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
147 let app_name = deserializer.field("app_name")?;
148 let version = deserializer.field("version")?;
149 let debug_mode = deserializer.field("debug_mode")?;
150 let max_connections = deserializer.field("max_connections")?;
151 let timeout_seconds = deserializer.field("timeout_seconds")?;
152 let features = deserializer.field("features")?;
153 let environment_vars = deserializer.field("environment_vars")?;
154 let optional_database_url = deserializer.field("optional_database_url")?;
155
156 Ok(AppSettings {
157 app_name,
158 version,
159 debug_mode,
160 max_connections,
161 timeout_seconds,
162 features,
163 environment_vars,
164 optional_database_url,
165 })
166 }
167}
168
169impl ToFieldValue for AppSettings {
170 fn to_field_value(&self) -> FieldValue {
171 // Convert to JSON and then parse as FieldValue for nested object handling
172 match self.to_json() {
173 Ok(json_str) => FieldValue::from_json_object(json_str),
174 Err(_) => FieldValue::from_string("serialization_error".to_string()),
175 }
176 }Sourcepub fn from_binary_object(data: Vec<u8>) -> Self
pub fn from_binary_object(data: Vec<u8>) -> Self
Sourcepub fn from_array(values: Vec<FieldValue>) -> Self
pub fn from_array(values: Vec<FieldValue>) -> Self
Sourcepub fn from_optional(value: Option<FieldValue>) -> Self
pub fn from_optional(value: Option<FieldValue>) -> Self
Sourcepub fn from_object(value: HashMap<String, FieldValue>) -> Self
pub fn from_object(value: HashMap<String, FieldValue>) -> Self
Sourcepub fn from_enum(variant: String, data: Option<FieldValue>) -> Self
pub fn from_enum(variant: String, data: Option<FieldValue>) -> Self
Sourcepub fn from_enum_unit(variant: String) -> Self
pub fn from_enum_unit(variant: String) -> Self
Sourcepub fn from_enum_tuple(variant: String, values: Vec<FieldValue>) -> Self
pub fn from_enum_tuple(variant: String, values: Vec<FieldValue>) -> Self
Sourcepub fn from_enum_struct(
variant: String,
fields: HashMap<String, FieldValue>,
) -> Self
pub fn from_enum_struct( variant: String, fields: HashMap<String, FieldValue>, ) -> Self
Sourcepub fn as_bool(&self) -> SerializationResult<bool>
pub fn as_bool(&self) -> SerializationResult<bool>
Extracts a boolean value with type validation
Attempts to extract a boolean value from the field value. Returns an error if the field value is not a boolean type.
§Returns
Ok(bool) if the field value is a boolean
Err(SerializationError::ValidationFailed) if the field value is not a boolean
Sourcepub fn as_i8(&self) -> SerializationResult<i8>
pub fn as_i8(&self) -> SerializationResult<i8>
Extracts an 8-bit signed integer value with type validation
Attempts to extract an 8-bit signed integer from the field value. Returns an error if the field value is not an i8 type.
§Returns
Ok(i8) if the field value is an 8-bit signed integer
Err(SerializationError::ValidationFailed) if the field value is not an i8
Sourcepub fn as_i16(&self) -> SerializationResult<i16>
pub fn as_i16(&self) -> SerializationResult<i16>
Extracts a 16-bit signed integer value with type validation
Attempts to extract a 16-bit signed integer from the field value. Returns an error if the field value is not an i16 type.
§Returns
Ok(i16) if the field value is a 16-bit signed integer
Err(SerializationError::ValidationFailed) if the field value is not an i16
Sourcepub fn as_i32(&self) -> SerializationResult<i32>
pub fn as_i32(&self) -> SerializationResult<i32>
Extracts a 32-bit signed integer value with type validation and conversion
Attempts to extract a 32-bit signed integer from the field value. Supports automatic conversion from smaller integer types (i8, i16) and validates range constraints for larger types (i64).
§Returns
Ok(i32) if the field value can be converted to a 32-bit signed integer
Err(SerializationError::ValidationFailed) if conversion fails or value is out of range
§Conversion Rules
- i8, i16: Automatic conversion (always safe)
- i32: Direct extraction
- i64: Conversion with range validation (must be within i32::MIN..=i32::MAX)
- Other types: Conversion not supported
Sourcepub fn as_i64(&self) -> SerializationResult<i64>
pub fn as_i64(&self) -> SerializationResult<i64>
Extracts a 64-bit signed integer value with type validation and conversion
Attempts to extract a 64-bit signed integer from the field value. Supports automatic conversion from smaller integer types (i8, i16, i32).
§Returns
Ok(i64) if the field value can be converted to a 64-bit signed integer
Err(SerializationError::ValidationFailed) if conversion is not supported
§Conversion Rules
- i8, i16, i32: Automatic conversion (always safe)
- i64: Direct extraction
- Other types: Conversion not supported
Sourcepub fn as_u8(&self) -> SerializationResult<u8>
pub fn as_u8(&self) -> SerializationResult<u8>
Extracts an 8-bit unsigned integer value with type validation
Attempts to extract an 8-bit unsigned integer from the field value. Returns an error if the field value is not a u8 type.
§Returns
Ok(u8) if the field value is an 8-bit unsigned integer
Err(SerializationError::ValidationFailed) if the field value is not a u8
Sourcepub fn as_u16(&self) -> SerializationResult<u16>
pub fn as_u16(&self) -> SerializationResult<u16>
Extracts a 16-bit unsigned integer value with type validation
Attempts to extract a 16-bit unsigned integer from the field value. Returns an error if the field value is not a u16 type.
§Returns
Ok(u16) if the field value is a 16-bit unsigned integer
Err(SerializationError::ValidationFailed) if the field value is not a u16
Sourcepub fn as_u32(&self) -> SerializationResult<u32>
pub fn as_u32(&self) -> SerializationResult<u32>
Extracts a 32-bit unsigned integer value with comprehensive type validation and conversion
Attempts to extract a 32-bit unsigned integer from the field value. Supports automatic conversion from compatible integer types with comprehensive range and sign validation.
§Returns
Ok(u32) if the field value can be converted to a 32-bit unsigned integer
Err(SerializationError::ValidationFailed) if conversion fails or value is out of range
§Conversion Rules
§Unsigned Types (Safe Conversions)
- u8, u16: Automatic conversion (always safe)
- u32: Direct extraction
- u64: Conversion with range validation (must be ≤ u32::MAX)
- usize: Conversion with range validation (must be ≤ u32::MAX)
§Signed Types (Sign Validation Required)
- i8, i16, i32: Conversion only if value ≥ 0
- i64: Conversion only if value ≥ 0 and ≤ u32::MAX
§Error Conditions
- Negative values from signed types
- Values exceeding u32::MAX from larger types
- Incompatible types (floats, strings, etc.)
Sourcepub fn as_u64(&self) -> SerializationResult<u64>
pub fn as_u64(&self) -> SerializationResult<u64>
Extracts a 64-bit unsigned integer value with type validation and conversion
Attempts to extract a 64-bit unsigned integer from the field value. Supports automatic conversion from smaller unsigned types and signed types with sign validation.
§Returns
Ok(u64) if the field value can be converted to a 64-bit unsigned integer
Err(SerializationError::ValidationFailed) if conversion fails or value is negative
§Conversion Rules
- u8, u16, u32, usize: Automatic conversion (always safe)
- u64: Direct extraction
- i8, i16, i32, i64: Conversion only if value ≥ 0
- Other types: Conversion not supported
Sourcepub fn as_usize(&self) -> SerializationResult<usize>
pub fn as_usize(&self) -> SerializationResult<usize>
Extracts a platform-specific size integer value with type validation and conversion
Attempts to extract a platform-specific size integer from the field value. Supports automatic conversion from smaller unsigned types and signed types with sign validation.
§Returns
Ok(usize) if the field value can be converted to a platform-specific size integer
Err(SerializationError::ValidationFailed) if conversion fails or value is negative
§Conversion Rules
- u8, u16, u32, u64: Automatic conversion (always safe)
- usize: Direct extraction
- i8, i16, i32, i64: Conversion only if value ≥ 0
- Other types: Conversion not supported
Sourcepub fn as_f32(&self) -> SerializationResult<f32>
pub fn as_f32(&self) -> SerializationResult<f32>
Extracts a 32-bit floating point value with type validation and conversion
Attempts to extract a 32-bit floating point number from the field value. Supports automatic conversion from all numeric types with potential precision loss.
§Returns
Ok(f32) if the field value can be converted to a 32-bit float
Err(SerializationError::ValidationFailed) if conversion is not supported
§Conversion Rules
- f32: Direct extraction
- f64: Conversion with potential precision loss
- All integer types: Automatic conversion (i8, i16, i32, i64, u8, u16, u32, u64, usize)
- Other types: Conversion not supported
Sourcepub fn as_f64(&self) -> SerializationResult<f64>
pub fn as_f64(&self) -> SerializationResult<f64>
Extracts a 64-bit floating point value with type validation and conversion
Attempts to extract a 64-bit floating point number from the field value. Supports automatic conversion from all numeric types without precision loss.
§Returns
Ok(f64) if the field value can be converted to a 64-bit float
Err(SerializationError::ValidationFailed) if conversion is not supported
§Conversion Rules
- f64: Direct extraction
- f32: Conversion without precision loss
- All integer types: Automatic conversion (i8, i16, i32, i64, u8, u16, u32, u64, usize)
- Other types: Conversion not supported
Sourcepub fn as_string(&self) -> SerializationResult<&str>
pub fn as_string(&self) -> SerializationResult<&str>
Extracts a string slice with type validation
Attempts to extract a string slice from the field value. Returns an error if the field value is not a string type.
§Returns
Ok(&str) if the field value is a string
Err(SerializationError::ValidationFailed) if the field value is not a string
Sourcepub fn as_bytes(&self) -> SerializationResult<&[u8]>
pub fn as_bytes(&self) -> SerializationResult<&[u8]>
Extracts a byte slice with type validation
Attempts to extract a byte slice from the field value. Returns an error if the field value is not a byte array type.
§Returns
Ok(&[u8]) if the field value is a byte array
Err(SerializationError::ValidationFailed) if the field value is not a byte array
Sourcepub fn to_bytes(&self) -> SerializationResult<Vec<u8>>
pub fn to_bytes(&self) -> SerializationResult<Vec<u8>>
Converts the field value to a byte vector with intelligent parsing
Attempts to convert the field value to a byte vector. For byte arrays, returns a clone of the data. For strings, attempts intelligent parsing including hex string conversion before falling back to UTF-8 encoding.
§Returns
Ok(Vec<u8>) containing the byte data
Err(SerializationError::ValidationFailed) if conversion fails
§String Parsing Rules
The method attempts the following parsing strategies in order:
- Hex string with 0x prefix:
"0x1234abcd"→[0x12, 0x34, 0xab, 0xcd] - Plain hex string:
"1234abcd"→[0x12, 0x34, 0xab, 0xcd] - UTF-8 encoding: Any other string → UTF-8 byte representation
§Hex String Requirements
- Must contain only ASCII hex digits (0-9, a-f, A-F)
- Must have even length (pairs of hex digits)
- Optional “0x” prefix for explicit hex notation
- Empty strings are treated as UTF-8
§Error Conditions
- Invalid hex characters in hex strings
- Odd-length hex strings
- Non-string/non-byte field values
Sourcepub fn as_json_object(&self) -> SerializationResult<&str>
pub fn as_json_object(&self) -> SerializationResult<&str>
Extracts a JSON object string with type validation
Attempts to extract a JSON object string from the field value. Returns an error if the field value is not a JSON object type.
§Returns
Ok(&str) if the field value is a JSON object string
Err(SerializationError::ValidationFailed) if the field value is not a JSON object
Examples found in repository?
91 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
92 // Try JSON object first
93 if let Ok(json_data) = value.as_json_object() {
94 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
95 field: field_name.to_string(),
96 message: format!("Failed to deserialize UserProfile from JSON: {}", e),
97 });
98 }
99
100 // Try binary object
101 if let Ok(binary_data) = value.as_binary_object() {
102 return Self::from_binary(binary_data).map_err(|e| {
103 SerializationError::ValidationFailed {
104 field: field_name.to_string(),
105 message: format!("Failed to deserialize UserProfile from binary: {}", e),
106 }
107 });
108 }
109
110 Err(SerializationError::ValidationFailed {
111 field: field_name.to_string(),
112 message: format!(
113 "Expected JsonObject or BinaryObject for UserProfile, found {}",
114 value.type_name()
115 ),
116 })
117 }
118}
119
120/// Application settings struct with optional fields and collections
121#[derive(Debug, Clone, PartialEq)]
122pub struct AppSettings {
123 pub app_name: String,
124 pub version: String,
125 pub debug_mode: bool,
126 pub max_connections: u32,
127 pub timeout_seconds: f32,
128 pub features: Vec<String>,
129 pub environment_vars: HashMap<String, String>,
130 pub optional_database_url: Option<String>,
131}
132
133impl StructSerializable for AppSettings {
134 fn to_serializer(&self) -> StructSerializer {
135 StructSerializer::new()
136 .field("app_name", &self.app_name)
137 .field("version", &self.version)
138 .field("debug_mode", &self.debug_mode)
139 .field("max_connections", &self.max_connections)
140 .field("timeout_seconds", &self.timeout_seconds)
141 .field("features", &self.features)
142 .field("environment_vars", &self.environment_vars)
143 .field("optional_database_url", &self.optional_database_url)
144 }
145
146 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
147 let app_name = deserializer.field("app_name")?;
148 let version = deserializer.field("version")?;
149 let debug_mode = deserializer.field("debug_mode")?;
150 let max_connections = deserializer.field("max_connections")?;
151 let timeout_seconds = deserializer.field("timeout_seconds")?;
152 let features = deserializer.field("features")?;
153 let environment_vars = deserializer.field("environment_vars")?;
154 let optional_database_url = deserializer.field("optional_database_url")?;
155
156 Ok(AppSettings {
157 app_name,
158 version,
159 debug_mode,
160 max_connections,
161 timeout_seconds,
162 features,
163 environment_vars,
164 optional_database_url,
165 })
166 }
167}
168
169impl ToFieldValue for AppSettings {
170 fn to_field_value(&self) -> FieldValue {
171 // Convert to JSON and then parse as FieldValue for nested object handling
172 match self.to_json() {
173 Ok(json_str) => FieldValue::from_json_object(json_str),
174 Err(_) => FieldValue::from_string("serialization_error".to_string()),
175 }
176 }
177}
178
179impl FromFieldValue for AppSettings {
180 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
181 // Try JSON object first
182 if let Ok(json_data) = value.as_json_object() {
183 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
184 field: field_name.to_string(),
185 message: format!("Failed to deserialize AppSettings from JSON: {}", e),
186 });
187 }
188
189 // Try binary object
190 if let Ok(binary_data) = value.as_binary_object() {
191 return Self::from_binary(binary_data).map_err(|e| {
192 SerializationError::ValidationFailed {
193 field: field_name.to_string(),
194 message: format!("Failed to deserialize AppSettings from binary: {}", e),
195 }
196 });
197 }
198
199 Err(SerializationError::ValidationFailed {
200 field: field_name.to_string(),
201 message: format!(
202 "Expected JsonObject or BinaryObject for AppSettings, found {}",
203 value.type_name()
204 ),
205 })
206 }More examples
83 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
84 // Try JSON object first
85 if let Ok(json_data) = value.as_json_object() {
86 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
87 field: field_name.to_string(),
88 message: format!("Failed to deserialize ContactInfo from JSON: {}", e),
89 });
90 }
91
92 // Try binary object
93 if let Ok(binary_data) = value.as_binary_object() {
94 return Self::from_binary(binary_data).map_err(|e| {
95 SerializationError::ValidationFailed {
96 field: field_name.to_string(),
97 message: format!("Failed to deserialize ContactInfo from binary: {}", e),
98 }
99 });
100 }
101
102 Err(SerializationError::ValidationFailed {
103 field: field_name.to_string(),
104 message: format!(
105 "Expected JsonObject or BinaryObject for ContactInfo, found {}",
106 value.type_name()
107 ),
108 })
109 }
110}
111
112/// Address struct
113#[derive(Debug, Clone, PartialEq)]
114pub struct Address {
115 pub street: String,
116 pub city: String,
117 pub state: String,
118 pub postal_code: String,
119 pub country: String,
120}
121
122impl StructSerializable for Address {
123 fn to_serializer(&self) -> StructSerializer {
124 StructSerializer::new()
125 .field("street", &self.street)
126 .field("city", &self.city)
127 .field("state", &self.state)
128 .field("postal_code", &self.postal_code)
129 .field("country", &self.country)
130 }
131
132 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
133 let street = deserializer.field("street")?;
134 let city = deserializer.field("city")?;
135 let state = deserializer.field("state")?;
136 let postal_code = deserializer.field("postal_code")?;
137 let country = deserializer.field("country")?;
138
139 Ok(Address {
140 street,
141 city,
142 state,
143 postal_code,
144 country,
145 })
146 }
147}
148
149impl ToFieldValue for Address {
150 fn to_field_value(&self) -> FieldValue {
151 match self.to_json() {
152 Ok(json_str) => FieldValue::from_json_object(json_str),
153 Err(_) => FieldValue::from_string("serialization_error".to_string()),
154 }
155 }
156}
157
158impl FromFieldValue for Address {
159 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
160 // Try JSON object first
161 if let Ok(json_data) = value.as_json_object() {
162 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
163 field: field_name.to_string(),
164 message: format!("Failed to deserialize Address from JSON: {}", e),
165 });
166 }
167
168 // Try binary object
169 if let Ok(binary_data) = value.as_binary_object() {
170 return Self::from_binary(binary_data).map_err(|e| {
171 SerializationError::ValidationFailed {
172 field: field_name.to_string(),
173 message: format!("Failed to deserialize Address from binary: {}", e),
174 }
175 });
176 }
177
178 Err(SerializationError::ValidationFailed {
179 field: field_name.to_string(),
180 message: format!(
181 "Expected JsonObject or BinaryObject for Address, found {}",
182 value.type_name()
183 ),
184 })
185 }
186}
187
188/// Project information struct
189#[derive(Debug, Clone, PartialEq)]
190pub struct Project {
191 pub name: String,
192 pub description: String,
193 pub status: ProjectStatus,
194 pub budget: f64,
195 pub team_members: Vec<String>,
196 pub milestones: Vec<Milestone>,
197 pub metadata: HashMap<String, String>,
198}
199
200impl StructSerializable for Project {
201 fn to_serializer(&self) -> StructSerializer {
202 StructSerializer::new()
203 .field("name", &self.name)
204 .field("description", &self.description)
205 .field("status", &self.status)
206 .field("budget", &self.budget)
207 .field("team_members", &self.team_members)
208 .field("milestones", &self.milestones)
209 .field("metadata", &self.metadata)
210 }
211
212 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
213 let name = deserializer.field("name")?;
214 let description = deserializer.field("description")?;
215 let status = deserializer.field("status")?;
216 let budget = deserializer.field("budget")?;
217 let team_members = deserializer.field("team_members")?;
218 let milestones = deserializer.field("milestones")?;
219 let metadata = deserializer.field("metadata")?;
220
221 Ok(Project {
222 name,
223 description,
224 status,
225 budget,
226 team_members,
227 milestones,
228 metadata,
229 })
230 }
231}
232
233impl ToFieldValue for Project {
234 fn to_field_value(&self) -> FieldValue {
235 match self.to_json() {
236 Ok(json_str) => FieldValue::from_json_object(json_str),
237 Err(_) => FieldValue::from_string("serialization_error".to_string()),
238 }
239 }
240}
241
242impl FromFieldValue for Project {
243 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
244 // Try JSON object first
245 if let Ok(json_data) = value.as_json_object() {
246 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
247 field: field_name.to_string(),
248 message: format!("Failed to deserialize Project from JSON: {}", e),
249 });
250 }
251
252 // Try binary object
253 if let Ok(binary_data) = value.as_binary_object() {
254 return Self::from_binary(binary_data).map_err(|e| {
255 SerializationError::ValidationFailed {
256 field: field_name.to_string(),
257 message: format!("Failed to deserialize Project from binary: {}", e),
258 }
259 });
260 }
261
262 Err(SerializationError::ValidationFailed {
263 field: field_name.to_string(),
264 message: format!(
265 "Expected JsonObject or BinaryObject for Project, found {}",
266 value.type_name()
267 ),
268 })
269 }
270}
271
272/// Project status enumeration
273#[derive(Debug, Clone, PartialEq)]
274pub enum ProjectStatus {
275 Planning,
276 InProgress,
277 OnHold,
278 Completed,
279 Cancelled,
280}
281
282impl ToFieldValue for ProjectStatus {
283 fn to_field_value(&self) -> FieldValue {
284 let status_str = match self {
285 ProjectStatus::Planning => "planning",
286 ProjectStatus::InProgress => "in_progress",
287 ProjectStatus::OnHold => "on_hold",
288 ProjectStatus::Completed => "completed",
289 ProjectStatus::Cancelled => "cancelled",
290 };
291 FieldValue::from_string(status_str.to_string())
292 }
293}
294
295impl FromFieldValue for ProjectStatus {
296 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
297 match value {
298 FieldValue::String(s) => match s.as_str() {
299 "planning" => Ok(ProjectStatus::Planning),
300 "in_progress" => Ok(ProjectStatus::InProgress),
301 "on_hold" => Ok(ProjectStatus::OnHold),
302 "completed" => Ok(ProjectStatus::Completed),
303 "cancelled" => Ok(ProjectStatus::Cancelled),
304 _ => Err(SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Unknown project status: {}", s),
307 }),
308 },
309 _ => Err(SerializationError::ValidationFailed {
310 field: field_name.to_string(),
311 message: format!(
312 "Expected String for ProjectStatus, found {}",
313 value.type_name()
314 ),
315 }),
316 }
317 }
318}
319
320/// Project milestone struct
321#[derive(Debug, Clone, PartialEq)]
322pub struct Milestone {
323 pub name: String,
324 pub description: String,
325 pub due_date: String, // Simplified as string for this example
326 pub is_completed: bool,
327 pub progress_percentage: f32,
328 pub dependencies: Vec<String>,
329}
330
331impl StructSerializable for Milestone {
332 fn to_serializer(&self) -> StructSerializer {
333 StructSerializer::new()
334 .field("name", &self.name)
335 .field("description", &self.description)
336 .field("due_date", &self.due_date)
337 .field("is_completed", &self.is_completed)
338 .field("progress_percentage", &self.progress_percentage)
339 .field("dependencies", &self.dependencies)
340 }
341
342 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
343 let name = deserializer.field("name")?;
344 let description = deserializer.field("description")?;
345 let due_date = deserializer.field("due_date")?;
346 let is_completed = deserializer.field("is_completed")?;
347 let progress_percentage = deserializer.field("progress_percentage")?;
348 let dependencies = deserializer.field("dependencies")?;
349
350 Ok(Milestone {
351 name,
352 description,
353 due_date,
354 is_completed,
355 progress_percentage,
356 dependencies,
357 })
358 }
359}
360
361impl ToFieldValue for Milestone {
362 fn to_field_value(&self) -> FieldValue {
363 match self.to_json() {
364 Ok(json_str) => FieldValue::from_json_object(json_str),
365 Err(_) => FieldValue::from_string("serialization_error".to_string()),
366 }
367 }
368}
369
370impl FromFieldValue for Milestone {
371 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
372 // Try JSON object first
373 if let Ok(json_data) = value.as_json_object() {
374 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
375 field: field_name.to_string(),
376 message: format!("Failed to deserialize Milestone from JSON: {}", e),
377 });
378 }
379
380 // Try binary object
381 if let Ok(binary_data) = value.as_binary_object() {
382 return Self::from_binary(binary_data).map_err(|e| {
383 SerializationError::ValidationFailed {
384 field: field_name.to_string(),
385 message: format!("Failed to deserialize Milestone from binary: {}", e),
386 }
387 });
388 }
389
390 Err(SerializationError::ValidationFailed {
391 field: field_name.to_string(),
392 message: format!(
393 "Expected JsonObject or BinaryObject for Milestone, found {}",
394 value.type_name()
395 ),
396 })
397 }
398}
399
400/// Company struct with basic collections and nesting
401#[derive(Debug, Clone, PartialEq)]
402pub struct Company {
403 pub name: String,
404 pub founded_year: i32,
405 pub headquarters_city: String,
406 pub headquarters_state: String,
407 pub employee_count: usize,
408 pub department_names: Vec<String>,
409 pub active_project_names: Vec<String>,
410 pub company_metadata: HashMap<String, String>,
411}
412
413impl StructSerializable for Company {
414 fn to_serializer(&self) -> StructSerializer {
415 StructSerializer::new()
416 .field("name", &self.name)
417 .field("founded_year", &self.founded_year)
418 .field("headquarters_city", &self.headquarters_city)
419 .field("headquarters_state", &self.headquarters_state)
420 .field("employee_count", &self.employee_count)
421 .field("department_names", &self.department_names)
422 .field("active_project_names", &self.active_project_names)
423 .field("company_metadata", &self.company_metadata)
424 }
425
426 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
427 let name = deserializer.field("name")?;
428 let founded_year = deserializer.field("founded_year")?;
429 let headquarters_city = deserializer.field("headquarters_city")?;
430 let headquarters_state = deserializer.field("headquarters_state")?;
431 let employee_count = deserializer.field("employee_count")?;
432 let department_names = deserializer.field("department_names")?;
433 let active_project_names = deserializer.field("active_project_names")?;
434 let company_metadata = deserializer.field("company_metadata")?;
435
436 Ok(Company {
437 name,
438 founded_year,
439 headquarters_city,
440 headquarters_state,
441 employee_count,
442 department_names,
443 active_project_names,
444 company_metadata,
445 })
446 }
447}
448
449impl ToFieldValue for Company {
450 fn to_field_value(&self) -> FieldValue {
451 match self.to_json() {
452 Ok(json_str) => FieldValue::from_json_object(json_str),
453 Err(_) => FieldValue::from_string("serialization_error".to_string()),
454 }
455 }
456}
457
458impl FromFieldValue for Company {
459 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
460 // Try JSON object first
461 if let Ok(json_data) = value.as_json_object() {
462 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
463 field: field_name.to_string(),
464 message: format!("Failed to deserialize Company from JSON: {}", e),
465 });
466 }
467
468 // Try binary object
469 if let Ok(binary_data) = value.as_binary_object() {
470 return Self::from_binary(binary_data).map_err(|e| {
471 SerializationError::ValidationFailed {
472 field: field_name.to_string(),
473 message: format!("Failed to deserialize Company from binary: {}", e),
474 }
475 });
476 }
477
478 Err(SerializationError::ValidationFailed {
479 field: field_name.to_string(),
480 message: format!(
481 "Expected JsonObject or BinaryObject for Company, found {}",
482 value.type_name()
483 ),
484 })
485 }
486}
487
488/// Department struct
489#[derive(Debug, Clone, PartialEq)]
490pub struct Department {
491 pub name: String,
492 pub manager: String,
493 pub employee_count: u32,
494 pub budget: f64,
495 pub office_locations: Vec<Address>,
496}
497
498impl StructSerializable for Department {
499 fn to_serializer(&self) -> StructSerializer {
500 StructSerializer::new()
501 .field("name", &self.name)
502 .field("manager", &self.manager)
503 .field("employee_count", &self.employee_count)
504 .field("budget", &self.budget)
505 .field("office_locations", &self.office_locations)
506 }
507
508 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
509 let name = deserializer.field("name")?;
510 let manager = deserializer.field("manager")?;
511 let employee_count = deserializer.field("employee_count")?;
512 let budget = deserializer.field("budget")?;
513 let office_locations = deserializer.field("office_locations")?;
514
515 Ok(Department {
516 name,
517 manager,
518 employee_count,
519 budget,
520 office_locations,
521 })
522 }
523}
524
525impl ToFieldValue for Department {
526 fn to_field_value(&self) -> FieldValue {
527 match self.to_json() {
528 Ok(json_str) => FieldValue::from_json_object(json_str),
529 Err(_) => FieldValue::from_string("serialization_error".to_string()),
530 }
531 }
532}
533
534impl FromFieldValue for Department {
535 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
536 // Try JSON object first
537 if let Ok(json_data) = value.as_json_object() {
538 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
539 field: field_name.to_string(),
540 message: format!("Failed to deserialize Department from JSON: {}", e),
541 });
542 }
543
544 // Try binary object
545 if let Ok(binary_data) = value.as_binary_object() {
546 return Self::from_binary(binary_data).map_err(|e| {
547 SerializationError::ValidationFailed {
548 field: field_name.to_string(),
549 message: format!("Failed to deserialize Department from binary: {}", e),
550 }
551 });
552 }
553
554 Err(SerializationError::ValidationFailed {
555 field: field_name.to_string(),
556 message: format!(
557 "Expected JsonObject or BinaryObject for Department, found {}",
558 value.type_name()
559 ),
560 })
561 }94 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
95 // Try JSON object first
96 if let Ok(json_data) = value.as_json_object() {
97 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
98 field: field_name.to_string(),
99 message: format!("Failed to deserialize VersionedData from JSON: {}", e),
100 });
101 }
102
103 // Try binary object
104 if let Ok(binary_data) = value.as_binary_object() {
105 return Self::from_binary(binary_data).map_err(|e| {
106 SerializationError::ValidationFailed {
107 field: field_name.to_string(),
108 message: format!("Failed to deserialize VersionedData from binary: {}", e),
109 }
110 });
111 }
112
113 Err(SerializationError::ValidationFailed {
114 field: field_name.to_string(),
115 message: format!(
116 "Expected JsonObject or BinaryObject for VersionedData, found {}",
117 value.type_name()
118 ),
119 })
120 }
121}
122
123/// Validated user input with constraints
124#[derive(Debug, Clone, PartialEq)]
125pub struct ValidatedUserInput {
126 pub username: String,
127 pub email: String,
128 pub age: u16,
129 pub preferences: HashMap<String, String>,
130}
131
132impl StructSerializable for ValidatedUserInput {
133 fn to_serializer(&self) -> StructSerializer {
134 StructSerializer::new()
135 .field("username", &self.username)
136 .field("email", &self.email)
137 .field("age", &self.age)
138 .field("preferences", &self.preferences)
139 }
140
141 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
142 let username: String = deserializer.field("username")?;
143 let email: String = deserializer.field("email")?;
144 let age: u16 = deserializer.field("age")?;
145 let preferences: HashMap<String, String> = deserializer.field("preferences")?;
146
147 // Validate username
148 if username.is_empty() || username.len() > 50 {
149 return Err(SerializationError::ValidationFailed {
150 field: "username".to_string(),
151 message: "Username must be 1-50 characters long".to_string(),
152 });
153 }
154
155 if !username
156 .chars()
157 .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
158 {
159 return Err(SerializationError::ValidationFailed {
160 field: "username".to_string(),
161 message:
162 "Username can only contain alphanumeric characters, underscores, and hyphens"
163 .to_string(),
164 });
165 }
166
167 // Validate email (basic check)
168 if !email.contains('@') || !email.contains('.') || email.len() < 5 {
169 return Err(SerializationError::ValidationFailed {
170 field: "email".to_string(),
171 message: "Invalid email format".to_string(),
172 });
173 }
174
175 // Validate age
176 if !(13..=120).contains(&age) {
177 return Err(SerializationError::ValidationFailed {
178 field: "age".to_string(),
179 message: "Age must be between 13 and 120".to_string(),
180 });
181 }
182
183 // Validate preferences
184 if preferences.len() > 20 {
185 return Err(SerializationError::ValidationFailed {
186 field: "preferences".to_string(),
187 message: "Too many preferences (maximum 20)".to_string(),
188 });
189 }
190
191 for (key, value) in &preferences {
192 if key.len() > 50 || value.len() > 200 {
193 return Err(SerializationError::ValidationFailed {
194 field: "preferences".to_string(),
195 message: format!("Preference key/value too long: {}", key),
196 });
197 }
198 }
199
200 Ok(ValidatedUserInput {
201 username,
202 email,
203 age,
204 preferences,
205 })
206 }
207}
208
209impl ToFieldValue for ValidatedUserInput {
210 fn to_field_value(&self) -> FieldValue {
211 match self.to_json() {
212 Ok(json_str) => FieldValue::from_json_object(json_str),
213 Err(_) => FieldValue::from_string("serialization_error".to_string()),
214 }
215 }
216}
217
218impl FromFieldValue for ValidatedUserInput {
219 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
220 // Try JSON object first
221 if let Ok(json_data) = value.as_json_object() {
222 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
223 field: field_name.to_string(),
224 message: format!("Failed to deserialize ValidatedUserInput from JSON: {}", e),
225 });
226 }
227
228 // Try binary object
229 if let Ok(binary_data) = value.as_binary_object() {
230 return Self::from_binary(binary_data).map_err(|e| {
231 SerializationError::ValidationFailed {
232 field: field_name.to_string(),
233 message: format!(
234 "Failed to deserialize ValidatedUserInput from binary: {}",
235 e
236 ),
237 }
238 });
239 }
240
241 Err(SerializationError::ValidationFailed {
242 field: field_name.to_string(),
243 message: format!(
244 "Expected JsonObject or BinaryObject for ValidatedUserInput, found {}",
245 value.type_name()
246 ),
247 })
248 }
249}
250
251/// Recovery helper for handling partial data
252#[derive(Debug, Clone, PartialEq)]
253pub struct RecoverableData {
254 pub critical_field: String,
255 pub important_field: Option<String>,
256 pub optional_field: Option<String>,
257 pub metadata: HashMap<String, String>,
258}
259
260impl StructSerializable for RecoverableData {
261 fn to_serializer(&self) -> StructSerializer {
262 StructSerializer::new()
263 .field("critical_field", &self.critical_field)
264 .field("important_field", &self.important_field)
265 .field("optional_field", &self.optional_field)
266 .field("metadata", &self.metadata)
267 }
268
269 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
270 // Critical field - must exist
271 let critical_field = deserializer.field("critical_field")?;
272
273 // Important field - try to recover if missing
274 let important_field = deserializer.field_optional("important_field")?;
275
276 // Optional field - graceful fallback
277 let optional_field = deserializer.field_optional("optional_field")?;
278
279 // Metadata - recover what we can
280 let metadata = deserializer.field_or("metadata", HashMap::new())?;
281
282 Ok(RecoverableData {
283 critical_field,
284 important_field,
285 optional_field,
286 metadata,
287 })
288 }
289}
290
291impl ToFieldValue for RecoverableData {
292 fn to_field_value(&self) -> FieldValue {
293 match self.to_json() {
294 Ok(json_str) => FieldValue::from_json_object(json_str),
295 Err(_) => FieldValue::from_string("serialization_error".to_string()),
296 }
297 }
298}
299
300impl FromFieldValue for RecoverableData {
301 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
302 // Try JSON object first
303 if let Ok(json_data) = value.as_json_object() {
304 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Failed to deserialize RecoverableData from JSON: {}", e),
307 });
308 }
309
310 // Try binary object
311 if let Ok(binary_data) = value.as_binary_object() {
312 return Self::from_binary(binary_data).map_err(|e| {
313 SerializationError::ValidationFailed {
314 field: field_name.to_string(),
315 message: format!("Failed to deserialize RecoverableData from binary: {}", e),
316 }
317 });
318 }
319
320 Err(SerializationError::ValidationFailed {
321 field: field_name.to_string(),
322 message: format!(
323 "Expected JsonObject or BinaryObject for RecoverableData, found {}",
324 value.type_name()
325 ),
326 })
327 }87 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
88 // Try JSON object first
89 if let Ok(json_data) = value.as_json_object() {
90 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
91 field: field_name.to_string(),
92 message: format!("Failed to deserialize PerformanceMetrics from JSON: {}", e),
93 });
94 }
95
96 // Try binary object
97 if let Ok(binary_data) = value.as_binary_object() {
98 return Self::from_binary(binary_data).map_err(|e| {
99 SerializationError::ValidationFailed {
100 field: field_name.to_string(),
101 message: format!(
102 "Failed to deserialize PerformanceMetrics from binary: {}",
103 e
104 ),
105 }
106 });
107 }
108
109 Err(SerializationError::ValidationFailed {
110 field: field_name.to_string(),
111 message: format!(
112 "Expected JsonObject or BinaryObject for PerformanceMetrics, found {}",
113 value.type_name()
114 ),
115 })
116 }
117}
118
119/// Large dataset for performance testing
120#[derive(Debug, Clone, PartialEq)]
121pub struct LargeDataset {
122 pub name: String,
123 pub values: Vec<f32>, // Changed from f64 to f32 (supported)
124 pub labels: Vec<String>,
125 pub feature_count: usize, // Simplified from Vec<Vec<f32>> to just a count
126 pub feature_dimension: usize, // Store dimensions separately
127 pub metadata: HashMap<String, String>,
128 pub timestamp_count: usize, // Simplified from Vec<u64> to just count
129}
130
131impl StructSerializable for LargeDataset {
132 fn to_serializer(&self) -> StructSerializer {
133 StructSerializer::new()
134 .field("name", &self.name)
135 .field("values", &self.values)
136 .field("labels", &self.labels)
137 .field("feature_count", &self.feature_count)
138 .field("feature_dimension", &self.feature_dimension)
139 .field("metadata", &self.metadata)
140 .field("timestamp_count", &self.timestamp_count)
141 }
142
143 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
144 let name = deserializer.field("name")?;
145 let values = deserializer.field("values")?;
146 let labels = deserializer.field("labels")?;
147 let feature_count = deserializer.field("feature_count")?;
148 let feature_dimension = deserializer.field("feature_dimension")?;
149 let metadata = deserializer.field("metadata")?;
150 let timestamp_count = deserializer.field("timestamp_count")?;
151
152 Ok(LargeDataset {
153 name,
154 values,
155 labels,
156 feature_count,
157 feature_dimension,
158 metadata,
159 timestamp_count,
160 })
161 }
162}
163
164impl ToFieldValue for LargeDataset {
165 fn to_field_value(&self) -> FieldValue {
166 match self.to_json() {
167 Ok(json_str) => FieldValue::from_json_object(json_str),
168 Err(_) => FieldValue::from_string("serialization_error".to_string()),
169 }
170 }
171}
172
173impl FromFieldValue for LargeDataset {
174 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
175 // Try JSON object first
176 if let Ok(json_data) = value.as_json_object() {
177 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
178 field: field_name.to_string(),
179 message: format!("Failed to deserialize LargeDataset from JSON: {}", e),
180 });
181 }
182
183 // Try binary object
184 if let Ok(binary_data) = value.as_binary_object() {
185 return Self::from_binary(binary_data).map_err(|e| {
186 SerializationError::ValidationFailed {
187 field: field_name.to_string(),
188 message: format!("Failed to deserialize LargeDataset from binary: {}", e),
189 }
190 });
191 }
192
193 Err(SerializationError::ValidationFailed {
194 field: field_name.to_string(),
195 message: format!(
196 "Expected JsonObject or BinaryObject for LargeDataset, found {}",
197 value.type_name()
198 ),
199 })
200 }
201}
202
203/// Configuration data (typical JSON use case)
204#[derive(Debug, Clone, PartialEq)]
205pub struct Configuration {
206 pub version: String,
207 pub debug_enabled: bool,
208 pub log_level: String,
209 pub database_settings: HashMap<String, String>,
210 pub feature_flags_enabled: bool, // Simplified from HashMap<String, bool>
211 pub max_connections: f32, // Simplified from HashMap<String, f64>
212 pub timeout_seconds: f32,
213}
214
215impl StructSerializable for Configuration {
216 fn to_serializer(&self) -> StructSerializer {
217 StructSerializer::new()
218 .field("version", &self.version)
219 .field("debug_enabled", &self.debug_enabled)
220 .field("log_level", &self.log_level)
221 .field("database_settings", &self.database_settings)
222 .field("feature_flags_enabled", &self.feature_flags_enabled)
223 .field("max_connections", &self.max_connections)
224 .field("timeout_seconds", &self.timeout_seconds)
225 }
226
227 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
228 let version = deserializer.field("version")?;
229 let debug_enabled = deserializer.field("debug_enabled")?;
230 let log_level = deserializer.field("log_level")?;
231 let database_settings = deserializer.field("database_settings")?;
232 let feature_flags_enabled = deserializer.field("feature_flags_enabled")?;
233 let max_connections = deserializer.field("max_connections")?;
234 let timeout_seconds = deserializer.field("timeout_seconds")?;
235
236 Ok(Configuration {
237 version,
238 debug_enabled,
239 log_level,
240 database_settings,
241 feature_flags_enabled,
242 max_connections,
243 timeout_seconds,
244 })
245 }
246}
247
248impl ToFieldValue for Configuration {
249 fn to_field_value(&self) -> FieldValue {
250 match self.to_json() {
251 Ok(json_str) => FieldValue::from_json_object(json_str),
252 Err(_) => FieldValue::from_string("serialization_error".to_string()),
253 }
254 }
255}
256
257impl FromFieldValue for Configuration {
258 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
259 // Try JSON object first
260 if let Ok(json_data) = value.as_json_object() {
261 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
262 field: field_name.to_string(),
263 message: format!("Failed to deserialize Configuration from JSON: {}", e),
264 });
265 }
266
267 // Try binary object
268 if let Ok(binary_data) = value.as_binary_object() {
269 return Self::from_binary(binary_data).map_err(|e| {
270 SerializationError::ValidationFailed {
271 field: field_name.to_string(),
272 message: format!("Failed to deserialize Configuration from binary: {}", e),
273 }
274 });
275 }
276
277 Err(SerializationError::ValidationFailed {
278 field: field_name.to_string(),
279 message: format!(
280 "Expected JsonObject or BinaryObject for Configuration, found {}",
281 value.type_name()
282 ),
283 })
284 }Sourcepub fn as_binary_object(&self) -> SerializationResult<&[u8]>
pub fn as_binary_object(&self) -> SerializationResult<&[u8]>
Extracts binary object data with type validation
Attempts to extract binary object data from the field value. Returns an error if the field value is not a binary object type.
§Returns
Ok(&[u8]) if the field value is binary object data
Err(SerializationError::ValidationFailed) if the field value is not a binary object
Examples found in repository?
91 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
92 // Try JSON object first
93 if let Ok(json_data) = value.as_json_object() {
94 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
95 field: field_name.to_string(),
96 message: format!("Failed to deserialize UserProfile from JSON: {}", e),
97 });
98 }
99
100 // Try binary object
101 if let Ok(binary_data) = value.as_binary_object() {
102 return Self::from_binary(binary_data).map_err(|e| {
103 SerializationError::ValidationFailed {
104 field: field_name.to_string(),
105 message: format!("Failed to deserialize UserProfile from binary: {}", e),
106 }
107 });
108 }
109
110 Err(SerializationError::ValidationFailed {
111 field: field_name.to_string(),
112 message: format!(
113 "Expected JsonObject or BinaryObject for UserProfile, found {}",
114 value.type_name()
115 ),
116 })
117 }
118}
119
120/// Application settings struct with optional fields and collections
121#[derive(Debug, Clone, PartialEq)]
122pub struct AppSettings {
123 pub app_name: String,
124 pub version: String,
125 pub debug_mode: bool,
126 pub max_connections: u32,
127 pub timeout_seconds: f32,
128 pub features: Vec<String>,
129 pub environment_vars: HashMap<String, String>,
130 pub optional_database_url: Option<String>,
131}
132
133impl StructSerializable for AppSettings {
134 fn to_serializer(&self) -> StructSerializer {
135 StructSerializer::new()
136 .field("app_name", &self.app_name)
137 .field("version", &self.version)
138 .field("debug_mode", &self.debug_mode)
139 .field("max_connections", &self.max_connections)
140 .field("timeout_seconds", &self.timeout_seconds)
141 .field("features", &self.features)
142 .field("environment_vars", &self.environment_vars)
143 .field("optional_database_url", &self.optional_database_url)
144 }
145
146 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
147 let app_name = deserializer.field("app_name")?;
148 let version = deserializer.field("version")?;
149 let debug_mode = deserializer.field("debug_mode")?;
150 let max_connections = deserializer.field("max_connections")?;
151 let timeout_seconds = deserializer.field("timeout_seconds")?;
152 let features = deserializer.field("features")?;
153 let environment_vars = deserializer.field("environment_vars")?;
154 let optional_database_url = deserializer.field("optional_database_url")?;
155
156 Ok(AppSettings {
157 app_name,
158 version,
159 debug_mode,
160 max_connections,
161 timeout_seconds,
162 features,
163 environment_vars,
164 optional_database_url,
165 })
166 }
167}
168
169impl ToFieldValue for AppSettings {
170 fn to_field_value(&self) -> FieldValue {
171 // Convert to JSON and then parse as FieldValue for nested object handling
172 match self.to_json() {
173 Ok(json_str) => FieldValue::from_json_object(json_str),
174 Err(_) => FieldValue::from_string("serialization_error".to_string()),
175 }
176 }
177}
178
179impl FromFieldValue for AppSettings {
180 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
181 // Try JSON object first
182 if let Ok(json_data) = value.as_json_object() {
183 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
184 field: field_name.to_string(),
185 message: format!("Failed to deserialize AppSettings from JSON: {}", e),
186 });
187 }
188
189 // Try binary object
190 if let Ok(binary_data) = value.as_binary_object() {
191 return Self::from_binary(binary_data).map_err(|e| {
192 SerializationError::ValidationFailed {
193 field: field_name.to_string(),
194 message: format!("Failed to deserialize AppSettings from binary: {}", e),
195 }
196 });
197 }
198
199 Err(SerializationError::ValidationFailed {
200 field: field_name.to_string(),
201 message: format!(
202 "Expected JsonObject or BinaryObject for AppSettings, found {}",
203 value.type_name()
204 ),
205 })
206 }More examples
83 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
84 // Try JSON object first
85 if let Ok(json_data) = value.as_json_object() {
86 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
87 field: field_name.to_string(),
88 message: format!("Failed to deserialize ContactInfo from JSON: {}", e),
89 });
90 }
91
92 // Try binary object
93 if let Ok(binary_data) = value.as_binary_object() {
94 return Self::from_binary(binary_data).map_err(|e| {
95 SerializationError::ValidationFailed {
96 field: field_name.to_string(),
97 message: format!("Failed to deserialize ContactInfo from binary: {}", e),
98 }
99 });
100 }
101
102 Err(SerializationError::ValidationFailed {
103 field: field_name.to_string(),
104 message: format!(
105 "Expected JsonObject or BinaryObject for ContactInfo, found {}",
106 value.type_name()
107 ),
108 })
109 }
110}
111
112/// Address struct
113#[derive(Debug, Clone, PartialEq)]
114pub struct Address {
115 pub street: String,
116 pub city: String,
117 pub state: String,
118 pub postal_code: String,
119 pub country: String,
120}
121
122impl StructSerializable for Address {
123 fn to_serializer(&self) -> StructSerializer {
124 StructSerializer::new()
125 .field("street", &self.street)
126 .field("city", &self.city)
127 .field("state", &self.state)
128 .field("postal_code", &self.postal_code)
129 .field("country", &self.country)
130 }
131
132 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
133 let street = deserializer.field("street")?;
134 let city = deserializer.field("city")?;
135 let state = deserializer.field("state")?;
136 let postal_code = deserializer.field("postal_code")?;
137 let country = deserializer.field("country")?;
138
139 Ok(Address {
140 street,
141 city,
142 state,
143 postal_code,
144 country,
145 })
146 }
147}
148
149impl ToFieldValue for Address {
150 fn to_field_value(&self) -> FieldValue {
151 match self.to_json() {
152 Ok(json_str) => FieldValue::from_json_object(json_str),
153 Err(_) => FieldValue::from_string("serialization_error".to_string()),
154 }
155 }
156}
157
158impl FromFieldValue for Address {
159 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
160 // Try JSON object first
161 if let Ok(json_data) = value.as_json_object() {
162 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
163 field: field_name.to_string(),
164 message: format!("Failed to deserialize Address from JSON: {}", e),
165 });
166 }
167
168 // Try binary object
169 if let Ok(binary_data) = value.as_binary_object() {
170 return Self::from_binary(binary_data).map_err(|e| {
171 SerializationError::ValidationFailed {
172 field: field_name.to_string(),
173 message: format!("Failed to deserialize Address from binary: {}", e),
174 }
175 });
176 }
177
178 Err(SerializationError::ValidationFailed {
179 field: field_name.to_string(),
180 message: format!(
181 "Expected JsonObject or BinaryObject for Address, found {}",
182 value.type_name()
183 ),
184 })
185 }
186}
187
188/// Project information struct
189#[derive(Debug, Clone, PartialEq)]
190pub struct Project {
191 pub name: String,
192 pub description: String,
193 pub status: ProjectStatus,
194 pub budget: f64,
195 pub team_members: Vec<String>,
196 pub milestones: Vec<Milestone>,
197 pub metadata: HashMap<String, String>,
198}
199
200impl StructSerializable for Project {
201 fn to_serializer(&self) -> StructSerializer {
202 StructSerializer::new()
203 .field("name", &self.name)
204 .field("description", &self.description)
205 .field("status", &self.status)
206 .field("budget", &self.budget)
207 .field("team_members", &self.team_members)
208 .field("milestones", &self.milestones)
209 .field("metadata", &self.metadata)
210 }
211
212 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
213 let name = deserializer.field("name")?;
214 let description = deserializer.field("description")?;
215 let status = deserializer.field("status")?;
216 let budget = deserializer.field("budget")?;
217 let team_members = deserializer.field("team_members")?;
218 let milestones = deserializer.field("milestones")?;
219 let metadata = deserializer.field("metadata")?;
220
221 Ok(Project {
222 name,
223 description,
224 status,
225 budget,
226 team_members,
227 milestones,
228 metadata,
229 })
230 }
231}
232
233impl ToFieldValue for Project {
234 fn to_field_value(&self) -> FieldValue {
235 match self.to_json() {
236 Ok(json_str) => FieldValue::from_json_object(json_str),
237 Err(_) => FieldValue::from_string("serialization_error".to_string()),
238 }
239 }
240}
241
242impl FromFieldValue for Project {
243 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
244 // Try JSON object first
245 if let Ok(json_data) = value.as_json_object() {
246 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
247 field: field_name.to_string(),
248 message: format!("Failed to deserialize Project from JSON: {}", e),
249 });
250 }
251
252 // Try binary object
253 if let Ok(binary_data) = value.as_binary_object() {
254 return Self::from_binary(binary_data).map_err(|e| {
255 SerializationError::ValidationFailed {
256 field: field_name.to_string(),
257 message: format!("Failed to deserialize Project from binary: {}", e),
258 }
259 });
260 }
261
262 Err(SerializationError::ValidationFailed {
263 field: field_name.to_string(),
264 message: format!(
265 "Expected JsonObject or BinaryObject for Project, found {}",
266 value.type_name()
267 ),
268 })
269 }
270}
271
272/// Project status enumeration
273#[derive(Debug, Clone, PartialEq)]
274pub enum ProjectStatus {
275 Planning,
276 InProgress,
277 OnHold,
278 Completed,
279 Cancelled,
280}
281
282impl ToFieldValue for ProjectStatus {
283 fn to_field_value(&self) -> FieldValue {
284 let status_str = match self {
285 ProjectStatus::Planning => "planning",
286 ProjectStatus::InProgress => "in_progress",
287 ProjectStatus::OnHold => "on_hold",
288 ProjectStatus::Completed => "completed",
289 ProjectStatus::Cancelled => "cancelled",
290 };
291 FieldValue::from_string(status_str.to_string())
292 }
293}
294
295impl FromFieldValue for ProjectStatus {
296 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
297 match value {
298 FieldValue::String(s) => match s.as_str() {
299 "planning" => Ok(ProjectStatus::Planning),
300 "in_progress" => Ok(ProjectStatus::InProgress),
301 "on_hold" => Ok(ProjectStatus::OnHold),
302 "completed" => Ok(ProjectStatus::Completed),
303 "cancelled" => Ok(ProjectStatus::Cancelled),
304 _ => Err(SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Unknown project status: {}", s),
307 }),
308 },
309 _ => Err(SerializationError::ValidationFailed {
310 field: field_name.to_string(),
311 message: format!(
312 "Expected String for ProjectStatus, found {}",
313 value.type_name()
314 ),
315 }),
316 }
317 }
318}
319
320/// Project milestone struct
321#[derive(Debug, Clone, PartialEq)]
322pub struct Milestone {
323 pub name: String,
324 pub description: String,
325 pub due_date: String, // Simplified as string for this example
326 pub is_completed: bool,
327 pub progress_percentage: f32,
328 pub dependencies: Vec<String>,
329}
330
331impl StructSerializable for Milestone {
332 fn to_serializer(&self) -> StructSerializer {
333 StructSerializer::new()
334 .field("name", &self.name)
335 .field("description", &self.description)
336 .field("due_date", &self.due_date)
337 .field("is_completed", &self.is_completed)
338 .field("progress_percentage", &self.progress_percentage)
339 .field("dependencies", &self.dependencies)
340 }
341
342 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
343 let name = deserializer.field("name")?;
344 let description = deserializer.field("description")?;
345 let due_date = deserializer.field("due_date")?;
346 let is_completed = deserializer.field("is_completed")?;
347 let progress_percentage = deserializer.field("progress_percentage")?;
348 let dependencies = deserializer.field("dependencies")?;
349
350 Ok(Milestone {
351 name,
352 description,
353 due_date,
354 is_completed,
355 progress_percentage,
356 dependencies,
357 })
358 }
359}
360
361impl ToFieldValue for Milestone {
362 fn to_field_value(&self) -> FieldValue {
363 match self.to_json() {
364 Ok(json_str) => FieldValue::from_json_object(json_str),
365 Err(_) => FieldValue::from_string("serialization_error".to_string()),
366 }
367 }
368}
369
370impl FromFieldValue for Milestone {
371 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
372 // Try JSON object first
373 if let Ok(json_data) = value.as_json_object() {
374 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
375 field: field_name.to_string(),
376 message: format!("Failed to deserialize Milestone from JSON: {}", e),
377 });
378 }
379
380 // Try binary object
381 if let Ok(binary_data) = value.as_binary_object() {
382 return Self::from_binary(binary_data).map_err(|e| {
383 SerializationError::ValidationFailed {
384 field: field_name.to_string(),
385 message: format!("Failed to deserialize Milestone from binary: {}", e),
386 }
387 });
388 }
389
390 Err(SerializationError::ValidationFailed {
391 field: field_name.to_string(),
392 message: format!(
393 "Expected JsonObject or BinaryObject for Milestone, found {}",
394 value.type_name()
395 ),
396 })
397 }
398}
399
400/// Company struct with basic collections and nesting
401#[derive(Debug, Clone, PartialEq)]
402pub struct Company {
403 pub name: String,
404 pub founded_year: i32,
405 pub headquarters_city: String,
406 pub headquarters_state: String,
407 pub employee_count: usize,
408 pub department_names: Vec<String>,
409 pub active_project_names: Vec<String>,
410 pub company_metadata: HashMap<String, String>,
411}
412
413impl StructSerializable for Company {
414 fn to_serializer(&self) -> StructSerializer {
415 StructSerializer::new()
416 .field("name", &self.name)
417 .field("founded_year", &self.founded_year)
418 .field("headquarters_city", &self.headquarters_city)
419 .field("headquarters_state", &self.headquarters_state)
420 .field("employee_count", &self.employee_count)
421 .field("department_names", &self.department_names)
422 .field("active_project_names", &self.active_project_names)
423 .field("company_metadata", &self.company_metadata)
424 }
425
426 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
427 let name = deserializer.field("name")?;
428 let founded_year = deserializer.field("founded_year")?;
429 let headquarters_city = deserializer.field("headquarters_city")?;
430 let headquarters_state = deserializer.field("headquarters_state")?;
431 let employee_count = deserializer.field("employee_count")?;
432 let department_names = deserializer.field("department_names")?;
433 let active_project_names = deserializer.field("active_project_names")?;
434 let company_metadata = deserializer.field("company_metadata")?;
435
436 Ok(Company {
437 name,
438 founded_year,
439 headquarters_city,
440 headquarters_state,
441 employee_count,
442 department_names,
443 active_project_names,
444 company_metadata,
445 })
446 }
447}
448
449impl ToFieldValue for Company {
450 fn to_field_value(&self) -> FieldValue {
451 match self.to_json() {
452 Ok(json_str) => FieldValue::from_json_object(json_str),
453 Err(_) => FieldValue::from_string("serialization_error".to_string()),
454 }
455 }
456}
457
458impl FromFieldValue for Company {
459 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
460 // Try JSON object first
461 if let Ok(json_data) = value.as_json_object() {
462 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
463 field: field_name.to_string(),
464 message: format!("Failed to deserialize Company from JSON: {}", e),
465 });
466 }
467
468 // Try binary object
469 if let Ok(binary_data) = value.as_binary_object() {
470 return Self::from_binary(binary_data).map_err(|e| {
471 SerializationError::ValidationFailed {
472 field: field_name.to_string(),
473 message: format!("Failed to deserialize Company from binary: {}", e),
474 }
475 });
476 }
477
478 Err(SerializationError::ValidationFailed {
479 field: field_name.to_string(),
480 message: format!(
481 "Expected JsonObject or BinaryObject for Company, found {}",
482 value.type_name()
483 ),
484 })
485 }
486}
487
488/// Department struct
489#[derive(Debug, Clone, PartialEq)]
490pub struct Department {
491 pub name: String,
492 pub manager: String,
493 pub employee_count: u32,
494 pub budget: f64,
495 pub office_locations: Vec<Address>,
496}
497
498impl StructSerializable for Department {
499 fn to_serializer(&self) -> StructSerializer {
500 StructSerializer::new()
501 .field("name", &self.name)
502 .field("manager", &self.manager)
503 .field("employee_count", &self.employee_count)
504 .field("budget", &self.budget)
505 .field("office_locations", &self.office_locations)
506 }
507
508 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
509 let name = deserializer.field("name")?;
510 let manager = deserializer.field("manager")?;
511 let employee_count = deserializer.field("employee_count")?;
512 let budget = deserializer.field("budget")?;
513 let office_locations = deserializer.field("office_locations")?;
514
515 Ok(Department {
516 name,
517 manager,
518 employee_count,
519 budget,
520 office_locations,
521 })
522 }
523}
524
525impl ToFieldValue for Department {
526 fn to_field_value(&self) -> FieldValue {
527 match self.to_json() {
528 Ok(json_str) => FieldValue::from_json_object(json_str),
529 Err(_) => FieldValue::from_string("serialization_error".to_string()),
530 }
531 }
532}
533
534impl FromFieldValue for Department {
535 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
536 // Try JSON object first
537 if let Ok(json_data) = value.as_json_object() {
538 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
539 field: field_name.to_string(),
540 message: format!("Failed to deserialize Department from JSON: {}", e),
541 });
542 }
543
544 // Try binary object
545 if let Ok(binary_data) = value.as_binary_object() {
546 return Self::from_binary(binary_data).map_err(|e| {
547 SerializationError::ValidationFailed {
548 field: field_name.to_string(),
549 message: format!("Failed to deserialize Department from binary: {}", e),
550 }
551 });
552 }
553
554 Err(SerializationError::ValidationFailed {
555 field: field_name.to_string(),
556 message: format!(
557 "Expected JsonObject or BinaryObject for Department, found {}",
558 value.type_name()
559 ),
560 })
561 }94 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
95 // Try JSON object first
96 if let Ok(json_data) = value.as_json_object() {
97 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
98 field: field_name.to_string(),
99 message: format!("Failed to deserialize VersionedData from JSON: {}", e),
100 });
101 }
102
103 // Try binary object
104 if let Ok(binary_data) = value.as_binary_object() {
105 return Self::from_binary(binary_data).map_err(|e| {
106 SerializationError::ValidationFailed {
107 field: field_name.to_string(),
108 message: format!("Failed to deserialize VersionedData from binary: {}", e),
109 }
110 });
111 }
112
113 Err(SerializationError::ValidationFailed {
114 field: field_name.to_string(),
115 message: format!(
116 "Expected JsonObject or BinaryObject for VersionedData, found {}",
117 value.type_name()
118 ),
119 })
120 }
121}
122
123/// Validated user input with constraints
124#[derive(Debug, Clone, PartialEq)]
125pub struct ValidatedUserInput {
126 pub username: String,
127 pub email: String,
128 pub age: u16,
129 pub preferences: HashMap<String, String>,
130}
131
132impl StructSerializable for ValidatedUserInput {
133 fn to_serializer(&self) -> StructSerializer {
134 StructSerializer::new()
135 .field("username", &self.username)
136 .field("email", &self.email)
137 .field("age", &self.age)
138 .field("preferences", &self.preferences)
139 }
140
141 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
142 let username: String = deserializer.field("username")?;
143 let email: String = deserializer.field("email")?;
144 let age: u16 = deserializer.field("age")?;
145 let preferences: HashMap<String, String> = deserializer.field("preferences")?;
146
147 // Validate username
148 if username.is_empty() || username.len() > 50 {
149 return Err(SerializationError::ValidationFailed {
150 field: "username".to_string(),
151 message: "Username must be 1-50 characters long".to_string(),
152 });
153 }
154
155 if !username
156 .chars()
157 .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
158 {
159 return Err(SerializationError::ValidationFailed {
160 field: "username".to_string(),
161 message:
162 "Username can only contain alphanumeric characters, underscores, and hyphens"
163 .to_string(),
164 });
165 }
166
167 // Validate email (basic check)
168 if !email.contains('@') || !email.contains('.') || email.len() < 5 {
169 return Err(SerializationError::ValidationFailed {
170 field: "email".to_string(),
171 message: "Invalid email format".to_string(),
172 });
173 }
174
175 // Validate age
176 if !(13..=120).contains(&age) {
177 return Err(SerializationError::ValidationFailed {
178 field: "age".to_string(),
179 message: "Age must be between 13 and 120".to_string(),
180 });
181 }
182
183 // Validate preferences
184 if preferences.len() > 20 {
185 return Err(SerializationError::ValidationFailed {
186 field: "preferences".to_string(),
187 message: "Too many preferences (maximum 20)".to_string(),
188 });
189 }
190
191 for (key, value) in &preferences {
192 if key.len() > 50 || value.len() > 200 {
193 return Err(SerializationError::ValidationFailed {
194 field: "preferences".to_string(),
195 message: format!("Preference key/value too long: {}", key),
196 });
197 }
198 }
199
200 Ok(ValidatedUserInput {
201 username,
202 email,
203 age,
204 preferences,
205 })
206 }
207}
208
209impl ToFieldValue for ValidatedUserInput {
210 fn to_field_value(&self) -> FieldValue {
211 match self.to_json() {
212 Ok(json_str) => FieldValue::from_json_object(json_str),
213 Err(_) => FieldValue::from_string("serialization_error".to_string()),
214 }
215 }
216}
217
218impl FromFieldValue for ValidatedUserInput {
219 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
220 // Try JSON object first
221 if let Ok(json_data) = value.as_json_object() {
222 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
223 field: field_name.to_string(),
224 message: format!("Failed to deserialize ValidatedUserInput from JSON: {}", e),
225 });
226 }
227
228 // Try binary object
229 if let Ok(binary_data) = value.as_binary_object() {
230 return Self::from_binary(binary_data).map_err(|e| {
231 SerializationError::ValidationFailed {
232 field: field_name.to_string(),
233 message: format!(
234 "Failed to deserialize ValidatedUserInput from binary: {}",
235 e
236 ),
237 }
238 });
239 }
240
241 Err(SerializationError::ValidationFailed {
242 field: field_name.to_string(),
243 message: format!(
244 "Expected JsonObject or BinaryObject for ValidatedUserInput, found {}",
245 value.type_name()
246 ),
247 })
248 }
249}
250
251/// Recovery helper for handling partial data
252#[derive(Debug, Clone, PartialEq)]
253pub struct RecoverableData {
254 pub critical_field: String,
255 pub important_field: Option<String>,
256 pub optional_field: Option<String>,
257 pub metadata: HashMap<String, String>,
258}
259
260impl StructSerializable for RecoverableData {
261 fn to_serializer(&self) -> StructSerializer {
262 StructSerializer::new()
263 .field("critical_field", &self.critical_field)
264 .field("important_field", &self.important_field)
265 .field("optional_field", &self.optional_field)
266 .field("metadata", &self.metadata)
267 }
268
269 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
270 // Critical field - must exist
271 let critical_field = deserializer.field("critical_field")?;
272
273 // Important field - try to recover if missing
274 let important_field = deserializer.field_optional("important_field")?;
275
276 // Optional field - graceful fallback
277 let optional_field = deserializer.field_optional("optional_field")?;
278
279 // Metadata - recover what we can
280 let metadata = deserializer.field_or("metadata", HashMap::new())?;
281
282 Ok(RecoverableData {
283 critical_field,
284 important_field,
285 optional_field,
286 metadata,
287 })
288 }
289}
290
291impl ToFieldValue for RecoverableData {
292 fn to_field_value(&self) -> FieldValue {
293 match self.to_json() {
294 Ok(json_str) => FieldValue::from_json_object(json_str),
295 Err(_) => FieldValue::from_string("serialization_error".to_string()),
296 }
297 }
298}
299
300impl FromFieldValue for RecoverableData {
301 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
302 // Try JSON object first
303 if let Ok(json_data) = value.as_json_object() {
304 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Failed to deserialize RecoverableData from JSON: {}", e),
307 });
308 }
309
310 // Try binary object
311 if let Ok(binary_data) = value.as_binary_object() {
312 return Self::from_binary(binary_data).map_err(|e| {
313 SerializationError::ValidationFailed {
314 field: field_name.to_string(),
315 message: format!("Failed to deserialize RecoverableData from binary: {}", e),
316 }
317 });
318 }
319
320 Err(SerializationError::ValidationFailed {
321 field: field_name.to_string(),
322 message: format!(
323 "Expected JsonObject or BinaryObject for RecoverableData, found {}",
324 value.type_name()
325 ),
326 })
327 }87 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
88 // Try JSON object first
89 if let Ok(json_data) = value.as_json_object() {
90 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
91 field: field_name.to_string(),
92 message: format!("Failed to deserialize PerformanceMetrics from JSON: {}", e),
93 });
94 }
95
96 // Try binary object
97 if let Ok(binary_data) = value.as_binary_object() {
98 return Self::from_binary(binary_data).map_err(|e| {
99 SerializationError::ValidationFailed {
100 field: field_name.to_string(),
101 message: format!(
102 "Failed to deserialize PerformanceMetrics from binary: {}",
103 e
104 ),
105 }
106 });
107 }
108
109 Err(SerializationError::ValidationFailed {
110 field: field_name.to_string(),
111 message: format!(
112 "Expected JsonObject or BinaryObject for PerformanceMetrics, found {}",
113 value.type_name()
114 ),
115 })
116 }
117}
118
119/// Large dataset for performance testing
120#[derive(Debug, Clone, PartialEq)]
121pub struct LargeDataset {
122 pub name: String,
123 pub values: Vec<f32>, // Changed from f64 to f32 (supported)
124 pub labels: Vec<String>,
125 pub feature_count: usize, // Simplified from Vec<Vec<f32>> to just a count
126 pub feature_dimension: usize, // Store dimensions separately
127 pub metadata: HashMap<String, String>,
128 pub timestamp_count: usize, // Simplified from Vec<u64> to just count
129}
130
131impl StructSerializable for LargeDataset {
132 fn to_serializer(&self) -> StructSerializer {
133 StructSerializer::new()
134 .field("name", &self.name)
135 .field("values", &self.values)
136 .field("labels", &self.labels)
137 .field("feature_count", &self.feature_count)
138 .field("feature_dimension", &self.feature_dimension)
139 .field("metadata", &self.metadata)
140 .field("timestamp_count", &self.timestamp_count)
141 }
142
143 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
144 let name = deserializer.field("name")?;
145 let values = deserializer.field("values")?;
146 let labels = deserializer.field("labels")?;
147 let feature_count = deserializer.field("feature_count")?;
148 let feature_dimension = deserializer.field("feature_dimension")?;
149 let metadata = deserializer.field("metadata")?;
150 let timestamp_count = deserializer.field("timestamp_count")?;
151
152 Ok(LargeDataset {
153 name,
154 values,
155 labels,
156 feature_count,
157 feature_dimension,
158 metadata,
159 timestamp_count,
160 })
161 }
162}
163
164impl ToFieldValue for LargeDataset {
165 fn to_field_value(&self) -> FieldValue {
166 match self.to_json() {
167 Ok(json_str) => FieldValue::from_json_object(json_str),
168 Err(_) => FieldValue::from_string("serialization_error".to_string()),
169 }
170 }
171}
172
173impl FromFieldValue for LargeDataset {
174 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
175 // Try JSON object first
176 if let Ok(json_data) = value.as_json_object() {
177 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
178 field: field_name.to_string(),
179 message: format!("Failed to deserialize LargeDataset from JSON: {}", e),
180 });
181 }
182
183 // Try binary object
184 if let Ok(binary_data) = value.as_binary_object() {
185 return Self::from_binary(binary_data).map_err(|e| {
186 SerializationError::ValidationFailed {
187 field: field_name.to_string(),
188 message: format!("Failed to deserialize LargeDataset from binary: {}", e),
189 }
190 });
191 }
192
193 Err(SerializationError::ValidationFailed {
194 field: field_name.to_string(),
195 message: format!(
196 "Expected JsonObject or BinaryObject for LargeDataset, found {}",
197 value.type_name()
198 ),
199 })
200 }
201}
202
203/// Configuration data (typical JSON use case)
204#[derive(Debug, Clone, PartialEq)]
205pub struct Configuration {
206 pub version: String,
207 pub debug_enabled: bool,
208 pub log_level: String,
209 pub database_settings: HashMap<String, String>,
210 pub feature_flags_enabled: bool, // Simplified from HashMap<String, bool>
211 pub max_connections: f32, // Simplified from HashMap<String, f64>
212 pub timeout_seconds: f32,
213}
214
215impl StructSerializable for Configuration {
216 fn to_serializer(&self) -> StructSerializer {
217 StructSerializer::new()
218 .field("version", &self.version)
219 .field("debug_enabled", &self.debug_enabled)
220 .field("log_level", &self.log_level)
221 .field("database_settings", &self.database_settings)
222 .field("feature_flags_enabled", &self.feature_flags_enabled)
223 .field("max_connections", &self.max_connections)
224 .field("timeout_seconds", &self.timeout_seconds)
225 }
226
227 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
228 let version = deserializer.field("version")?;
229 let debug_enabled = deserializer.field("debug_enabled")?;
230 let log_level = deserializer.field("log_level")?;
231 let database_settings = deserializer.field("database_settings")?;
232 let feature_flags_enabled = deserializer.field("feature_flags_enabled")?;
233 let max_connections = deserializer.field("max_connections")?;
234 let timeout_seconds = deserializer.field("timeout_seconds")?;
235
236 Ok(Configuration {
237 version,
238 debug_enabled,
239 log_level,
240 database_settings,
241 feature_flags_enabled,
242 max_connections,
243 timeout_seconds,
244 })
245 }
246}
247
248impl ToFieldValue for Configuration {
249 fn to_field_value(&self) -> FieldValue {
250 match self.to_json() {
251 Ok(json_str) => FieldValue::from_json_object(json_str),
252 Err(_) => FieldValue::from_string("serialization_error".to_string()),
253 }
254 }
255}
256
257impl FromFieldValue for Configuration {
258 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
259 // Try JSON object first
260 if let Ok(json_data) = value.as_json_object() {
261 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
262 field: field_name.to_string(),
263 message: format!("Failed to deserialize Configuration from JSON: {}", e),
264 });
265 }
266
267 // Try binary object
268 if let Ok(binary_data) = value.as_binary_object() {
269 return Self::from_binary(binary_data).map_err(|e| {
270 SerializationError::ValidationFailed {
271 field: field_name.to_string(),
272 message: format!("Failed to deserialize Configuration from binary: {}", e),
273 }
274 });
275 }
276
277 Err(SerializationError::ValidationFailed {
278 field: field_name.to_string(),
279 message: format!(
280 "Expected JsonObject or BinaryObject for Configuration, found {}",
281 value.type_name()
282 ),
283 })
284 }Sourcepub fn as_array(&self) -> SerializationResult<&[FieldValue]>
pub fn as_array(&self) -> SerializationResult<&[FieldValue]>
Extracts an array of field values with type validation
Attempts to extract an array of field values from the field value. Returns an error if the field value is not an array type.
§Returns
Ok(&[FieldValue]) if the field value is an array
Err(SerializationError::ValidationFailed) if the field value is not an array
Sourcepub fn as_optional(&self) -> SerializationResult<Option<&FieldValue>>
pub fn as_optional(&self) -> SerializationResult<Option<&FieldValue>>
Extracts an optional field value with type validation
Attempts to extract an optional field value from the field value. Returns an error if the field value is not an optional type.
§Returns
Ok(Option<&FieldValue>) if the field value is an optional
Err(SerializationError::ValidationFailed) if the field value is not an optional
Sourcepub fn as_object(&self) -> SerializationResult<&HashMap<String, FieldValue>>
pub fn as_object(&self) -> SerializationResult<&HashMap<String, FieldValue>>
Extracts an object map with type validation
Attempts to extract a key-value object map from the field value. Returns an error if the field value is not an object type.
§Returns
Ok(&HashMap<String, FieldValue>) if the field value is an object
Err(SerializationError::ValidationFailed) if the field value is not an object
Sourcepub fn as_enum(&self) -> SerializationResult<(&str, Option<&FieldValue>)>
pub fn as_enum(&self) -> SerializationResult<(&str, Option<&FieldValue>)>
Extracts enum variant name and associated data with type validation
Attempts to extract both the enum variant name and its associated data from the field value. Returns an error if the field value is not an enum type.
§Returns
Ok((&str, Option<&FieldValue>)) containing the variant name and optional data
Err(SerializationError::ValidationFailed) if the field value is not an enum
Sourcepub fn as_enum_variant(&self) -> SerializationResult<&str>
pub fn as_enum_variant(&self) -> SerializationResult<&str>
Extracts enum variant name with type validation
Attempts to extract the enum variant name from the field value. Returns an error if the field value is not an enum type.
§Returns
Ok(&str) containing the enum variant name
Err(SerializationError::ValidationFailed) if the field value is not an enum
Sourcepub fn as_enum_data(&self) -> SerializationResult<Option<&FieldValue>>
pub fn as_enum_data(&self) -> SerializationResult<Option<&FieldValue>>
Extracts enum associated data with type validation
Attempts to extract the associated data from the enum field value. Returns an error if the field value is not an enum type.
§Returns
Ok(Option<&FieldValue>) containing the optional associated data
Err(SerializationError::ValidationFailed) if the field value is not an enum
Sourcepub fn type_name(&self) -> &'static str
pub fn type_name(&self) -> &'static str
Returns the human-readable type name for error reporting
Provides a consistent string representation of the field value type for use in error messages and debugging. The returned string is static and does not depend on the actual value content.
§Returns
A static string slice representing the type name
§Type Names
- Primitive types:
"bool","i8","i16","i32","i64","u8","u16","u32","u64","usize","f32","f64" - String types:
"string" - Binary types:
"bytes" - Object types:
"json_object","binary_object" - Collection types:
"array","optional","object" - Enum types:
"enum"
Examples found in repository?
91 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
92 // Try JSON object first
93 if let Ok(json_data) = value.as_json_object() {
94 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
95 field: field_name.to_string(),
96 message: format!("Failed to deserialize UserProfile from JSON: {}", e),
97 });
98 }
99
100 // Try binary object
101 if let Ok(binary_data) = value.as_binary_object() {
102 return Self::from_binary(binary_data).map_err(|e| {
103 SerializationError::ValidationFailed {
104 field: field_name.to_string(),
105 message: format!("Failed to deserialize UserProfile from binary: {}", e),
106 }
107 });
108 }
109
110 Err(SerializationError::ValidationFailed {
111 field: field_name.to_string(),
112 message: format!(
113 "Expected JsonObject or BinaryObject for UserProfile, found {}",
114 value.type_name()
115 ),
116 })
117 }
118}
119
120/// Application settings struct with optional fields and collections
121#[derive(Debug, Clone, PartialEq)]
122pub struct AppSettings {
123 pub app_name: String,
124 pub version: String,
125 pub debug_mode: bool,
126 pub max_connections: u32,
127 pub timeout_seconds: f32,
128 pub features: Vec<String>,
129 pub environment_vars: HashMap<String, String>,
130 pub optional_database_url: Option<String>,
131}
132
133impl StructSerializable for AppSettings {
134 fn to_serializer(&self) -> StructSerializer {
135 StructSerializer::new()
136 .field("app_name", &self.app_name)
137 .field("version", &self.version)
138 .field("debug_mode", &self.debug_mode)
139 .field("max_connections", &self.max_connections)
140 .field("timeout_seconds", &self.timeout_seconds)
141 .field("features", &self.features)
142 .field("environment_vars", &self.environment_vars)
143 .field("optional_database_url", &self.optional_database_url)
144 }
145
146 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
147 let app_name = deserializer.field("app_name")?;
148 let version = deserializer.field("version")?;
149 let debug_mode = deserializer.field("debug_mode")?;
150 let max_connections = deserializer.field("max_connections")?;
151 let timeout_seconds = deserializer.field("timeout_seconds")?;
152 let features = deserializer.field("features")?;
153 let environment_vars = deserializer.field("environment_vars")?;
154 let optional_database_url = deserializer.field("optional_database_url")?;
155
156 Ok(AppSettings {
157 app_name,
158 version,
159 debug_mode,
160 max_connections,
161 timeout_seconds,
162 features,
163 environment_vars,
164 optional_database_url,
165 })
166 }
167}
168
169impl ToFieldValue for AppSettings {
170 fn to_field_value(&self) -> FieldValue {
171 // Convert to JSON and then parse as FieldValue for nested object handling
172 match self.to_json() {
173 Ok(json_str) => FieldValue::from_json_object(json_str),
174 Err(_) => FieldValue::from_string("serialization_error".to_string()),
175 }
176 }
177}
178
179impl FromFieldValue for AppSettings {
180 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
181 // Try JSON object first
182 if let Ok(json_data) = value.as_json_object() {
183 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
184 field: field_name.to_string(),
185 message: format!("Failed to deserialize AppSettings from JSON: {}", e),
186 });
187 }
188
189 // Try binary object
190 if let Ok(binary_data) = value.as_binary_object() {
191 return Self::from_binary(binary_data).map_err(|e| {
192 SerializationError::ValidationFailed {
193 field: field_name.to_string(),
194 message: format!("Failed to deserialize AppSettings from binary: {}", e),
195 }
196 });
197 }
198
199 Err(SerializationError::ValidationFailed {
200 field: field_name.to_string(),
201 message: format!(
202 "Expected JsonObject or BinaryObject for AppSettings, found {}",
203 value.type_name()
204 ),
205 })
206 }More examples
83 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
84 // Try JSON object first
85 if let Ok(json_data) = value.as_json_object() {
86 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
87 field: field_name.to_string(),
88 message: format!("Failed to deserialize ContactInfo from JSON: {}", e),
89 });
90 }
91
92 // Try binary object
93 if let Ok(binary_data) = value.as_binary_object() {
94 return Self::from_binary(binary_data).map_err(|e| {
95 SerializationError::ValidationFailed {
96 field: field_name.to_string(),
97 message: format!("Failed to deserialize ContactInfo from binary: {}", e),
98 }
99 });
100 }
101
102 Err(SerializationError::ValidationFailed {
103 field: field_name.to_string(),
104 message: format!(
105 "Expected JsonObject or BinaryObject for ContactInfo, found {}",
106 value.type_name()
107 ),
108 })
109 }
110}
111
112/// Address struct
113#[derive(Debug, Clone, PartialEq)]
114pub struct Address {
115 pub street: String,
116 pub city: String,
117 pub state: String,
118 pub postal_code: String,
119 pub country: String,
120}
121
122impl StructSerializable for Address {
123 fn to_serializer(&self) -> StructSerializer {
124 StructSerializer::new()
125 .field("street", &self.street)
126 .field("city", &self.city)
127 .field("state", &self.state)
128 .field("postal_code", &self.postal_code)
129 .field("country", &self.country)
130 }
131
132 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
133 let street = deserializer.field("street")?;
134 let city = deserializer.field("city")?;
135 let state = deserializer.field("state")?;
136 let postal_code = deserializer.field("postal_code")?;
137 let country = deserializer.field("country")?;
138
139 Ok(Address {
140 street,
141 city,
142 state,
143 postal_code,
144 country,
145 })
146 }
147}
148
149impl ToFieldValue for Address {
150 fn to_field_value(&self) -> FieldValue {
151 match self.to_json() {
152 Ok(json_str) => FieldValue::from_json_object(json_str),
153 Err(_) => FieldValue::from_string("serialization_error".to_string()),
154 }
155 }
156}
157
158impl FromFieldValue for Address {
159 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
160 // Try JSON object first
161 if let Ok(json_data) = value.as_json_object() {
162 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
163 field: field_name.to_string(),
164 message: format!("Failed to deserialize Address from JSON: {}", e),
165 });
166 }
167
168 // Try binary object
169 if let Ok(binary_data) = value.as_binary_object() {
170 return Self::from_binary(binary_data).map_err(|e| {
171 SerializationError::ValidationFailed {
172 field: field_name.to_string(),
173 message: format!("Failed to deserialize Address from binary: {}", e),
174 }
175 });
176 }
177
178 Err(SerializationError::ValidationFailed {
179 field: field_name.to_string(),
180 message: format!(
181 "Expected JsonObject or BinaryObject for Address, found {}",
182 value.type_name()
183 ),
184 })
185 }
186}
187
188/// Project information struct
189#[derive(Debug, Clone, PartialEq)]
190pub struct Project {
191 pub name: String,
192 pub description: String,
193 pub status: ProjectStatus,
194 pub budget: f64,
195 pub team_members: Vec<String>,
196 pub milestones: Vec<Milestone>,
197 pub metadata: HashMap<String, String>,
198}
199
200impl StructSerializable for Project {
201 fn to_serializer(&self) -> StructSerializer {
202 StructSerializer::new()
203 .field("name", &self.name)
204 .field("description", &self.description)
205 .field("status", &self.status)
206 .field("budget", &self.budget)
207 .field("team_members", &self.team_members)
208 .field("milestones", &self.milestones)
209 .field("metadata", &self.metadata)
210 }
211
212 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
213 let name = deserializer.field("name")?;
214 let description = deserializer.field("description")?;
215 let status = deserializer.field("status")?;
216 let budget = deserializer.field("budget")?;
217 let team_members = deserializer.field("team_members")?;
218 let milestones = deserializer.field("milestones")?;
219 let metadata = deserializer.field("metadata")?;
220
221 Ok(Project {
222 name,
223 description,
224 status,
225 budget,
226 team_members,
227 milestones,
228 metadata,
229 })
230 }
231}
232
233impl ToFieldValue for Project {
234 fn to_field_value(&self) -> FieldValue {
235 match self.to_json() {
236 Ok(json_str) => FieldValue::from_json_object(json_str),
237 Err(_) => FieldValue::from_string("serialization_error".to_string()),
238 }
239 }
240}
241
242impl FromFieldValue for Project {
243 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
244 // Try JSON object first
245 if let Ok(json_data) = value.as_json_object() {
246 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
247 field: field_name.to_string(),
248 message: format!("Failed to deserialize Project from JSON: {}", e),
249 });
250 }
251
252 // Try binary object
253 if let Ok(binary_data) = value.as_binary_object() {
254 return Self::from_binary(binary_data).map_err(|e| {
255 SerializationError::ValidationFailed {
256 field: field_name.to_string(),
257 message: format!("Failed to deserialize Project from binary: {}", e),
258 }
259 });
260 }
261
262 Err(SerializationError::ValidationFailed {
263 field: field_name.to_string(),
264 message: format!(
265 "Expected JsonObject or BinaryObject for Project, found {}",
266 value.type_name()
267 ),
268 })
269 }
270}
271
272/// Project status enumeration
273#[derive(Debug, Clone, PartialEq)]
274pub enum ProjectStatus {
275 Planning,
276 InProgress,
277 OnHold,
278 Completed,
279 Cancelled,
280}
281
282impl ToFieldValue for ProjectStatus {
283 fn to_field_value(&self) -> FieldValue {
284 let status_str = match self {
285 ProjectStatus::Planning => "planning",
286 ProjectStatus::InProgress => "in_progress",
287 ProjectStatus::OnHold => "on_hold",
288 ProjectStatus::Completed => "completed",
289 ProjectStatus::Cancelled => "cancelled",
290 };
291 FieldValue::from_string(status_str.to_string())
292 }
293}
294
295impl FromFieldValue for ProjectStatus {
296 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
297 match value {
298 FieldValue::String(s) => match s.as_str() {
299 "planning" => Ok(ProjectStatus::Planning),
300 "in_progress" => Ok(ProjectStatus::InProgress),
301 "on_hold" => Ok(ProjectStatus::OnHold),
302 "completed" => Ok(ProjectStatus::Completed),
303 "cancelled" => Ok(ProjectStatus::Cancelled),
304 _ => Err(SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Unknown project status: {}", s),
307 }),
308 },
309 _ => Err(SerializationError::ValidationFailed {
310 field: field_name.to_string(),
311 message: format!(
312 "Expected String for ProjectStatus, found {}",
313 value.type_name()
314 ),
315 }),
316 }
317 }
318}
319
320/// Project milestone struct
321#[derive(Debug, Clone, PartialEq)]
322pub struct Milestone {
323 pub name: String,
324 pub description: String,
325 pub due_date: String, // Simplified as string for this example
326 pub is_completed: bool,
327 pub progress_percentage: f32,
328 pub dependencies: Vec<String>,
329}
330
331impl StructSerializable for Milestone {
332 fn to_serializer(&self) -> StructSerializer {
333 StructSerializer::new()
334 .field("name", &self.name)
335 .field("description", &self.description)
336 .field("due_date", &self.due_date)
337 .field("is_completed", &self.is_completed)
338 .field("progress_percentage", &self.progress_percentage)
339 .field("dependencies", &self.dependencies)
340 }
341
342 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
343 let name = deserializer.field("name")?;
344 let description = deserializer.field("description")?;
345 let due_date = deserializer.field("due_date")?;
346 let is_completed = deserializer.field("is_completed")?;
347 let progress_percentage = deserializer.field("progress_percentage")?;
348 let dependencies = deserializer.field("dependencies")?;
349
350 Ok(Milestone {
351 name,
352 description,
353 due_date,
354 is_completed,
355 progress_percentage,
356 dependencies,
357 })
358 }
359}
360
361impl ToFieldValue for Milestone {
362 fn to_field_value(&self) -> FieldValue {
363 match self.to_json() {
364 Ok(json_str) => FieldValue::from_json_object(json_str),
365 Err(_) => FieldValue::from_string("serialization_error".to_string()),
366 }
367 }
368}
369
370impl FromFieldValue for Milestone {
371 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
372 // Try JSON object first
373 if let Ok(json_data) = value.as_json_object() {
374 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
375 field: field_name.to_string(),
376 message: format!("Failed to deserialize Milestone from JSON: {}", e),
377 });
378 }
379
380 // Try binary object
381 if let Ok(binary_data) = value.as_binary_object() {
382 return Self::from_binary(binary_data).map_err(|e| {
383 SerializationError::ValidationFailed {
384 field: field_name.to_string(),
385 message: format!("Failed to deserialize Milestone from binary: {}", e),
386 }
387 });
388 }
389
390 Err(SerializationError::ValidationFailed {
391 field: field_name.to_string(),
392 message: format!(
393 "Expected JsonObject or BinaryObject for Milestone, found {}",
394 value.type_name()
395 ),
396 })
397 }
398}
399
400/// Company struct with basic collections and nesting
401#[derive(Debug, Clone, PartialEq)]
402pub struct Company {
403 pub name: String,
404 pub founded_year: i32,
405 pub headquarters_city: String,
406 pub headquarters_state: String,
407 pub employee_count: usize,
408 pub department_names: Vec<String>,
409 pub active_project_names: Vec<String>,
410 pub company_metadata: HashMap<String, String>,
411}
412
413impl StructSerializable for Company {
414 fn to_serializer(&self) -> StructSerializer {
415 StructSerializer::new()
416 .field("name", &self.name)
417 .field("founded_year", &self.founded_year)
418 .field("headquarters_city", &self.headquarters_city)
419 .field("headquarters_state", &self.headquarters_state)
420 .field("employee_count", &self.employee_count)
421 .field("department_names", &self.department_names)
422 .field("active_project_names", &self.active_project_names)
423 .field("company_metadata", &self.company_metadata)
424 }
425
426 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
427 let name = deserializer.field("name")?;
428 let founded_year = deserializer.field("founded_year")?;
429 let headquarters_city = deserializer.field("headquarters_city")?;
430 let headquarters_state = deserializer.field("headquarters_state")?;
431 let employee_count = deserializer.field("employee_count")?;
432 let department_names = deserializer.field("department_names")?;
433 let active_project_names = deserializer.field("active_project_names")?;
434 let company_metadata = deserializer.field("company_metadata")?;
435
436 Ok(Company {
437 name,
438 founded_year,
439 headquarters_city,
440 headquarters_state,
441 employee_count,
442 department_names,
443 active_project_names,
444 company_metadata,
445 })
446 }
447}
448
449impl ToFieldValue for Company {
450 fn to_field_value(&self) -> FieldValue {
451 match self.to_json() {
452 Ok(json_str) => FieldValue::from_json_object(json_str),
453 Err(_) => FieldValue::from_string("serialization_error".to_string()),
454 }
455 }
456}
457
458impl FromFieldValue for Company {
459 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
460 // Try JSON object first
461 if let Ok(json_data) = value.as_json_object() {
462 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
463 field: field_name.to_string(),
464 message: format!("Failed to deserialize Company from JSON: {}", e),
465 });
466 }
467
468 // Try binary object
469 if let Ok(binary_data) = value.as_binary_object() {
470 return Self::from_binary(binary_data).map_err(|e| {
471 SerializationError::ValidationFailed {
472 field: field_name.to_string(),
473 message: format!("Failed to deserialize Company from binary: {}", e),
474 }
475 });
476 }
477
478 Err(SerializationError::ValidationFailed {
479 field: field_name.to_string(),
480 message: format!(
481 "Expected JsonObject or BinaryObject for Company, found {}",
482 value.type_name()
483 ),
484 })
485 }
486}
487
488/// Department struct
489#[derive(Debug, Clone, PartialEq)]
490pub struct Department {
491 pub name: String,
492 pub manager: String,
493 pub employee_count: u32,
494 pub budget: f64,
495 pub office_locations: Vec<Address>,
496}
497
498impl StructSerializable for Department {
499 fn to_serializer(&self) -> StructSerializer {
500 StructSerializer::new()
501 .field("name", &self.name)
502 .field("manager", &self.manager)
503 .field("employee_count", &self.employee_count)
504 .field("budget", &self.budget)
505 .field("office_locations", &self.office_locations)
506 }
507
508 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
509 let name = deserializer.field("name")?;
510 let manager = deserializer.field("manager")?;
511 let employee_count = deserializer.field("employee_count")?;
512 let budget = deserializer.field("budget")?;
513 let office_locations = deserializer.field("office_locations")?;
514
515 Ok(Department {
516 name,
517 manager,
518 employee_count,
519 budget,
520 office_locations,
521 })
522 }
523}
524
525impl ToFieldValue for Department {
526 fn to_field_value(&self) -> FieldValue {
527 match self.to_json() {
528 Ok(json_str) => FieldValue::from_json_object(json_str),
529 Err(_) => FieldValue::from_string("serialization_error".to_string()),
530 }
531 }
532}
533
534impl FromFieldValue for Department {
535 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
536 // Try JSON object first
537 if let Ok(json_data) = value.as_json_object() {
538 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
539 field: field_name.to_string(),
540 message: format!("Failed to deserialize Department from JSON: {}", e),
541 });
542 }
543
544 // Try binary object
545 if let Ok(binary_data) = value.as_binary_object() {
546 return Self::from_binary(binary_data).map_err(|e| {
547 SerializationError::ValidationFailed {
548 field: field_name.to_string(),
549 message: format!("Failed to deserialize Department from binary: {}", e),
550 }
551 });
552 }
553
554 Err(SerializationError::ValidationFailed {
555 field: field_name.to_string(),
556 message: format!(
557 "Expected JsonObject or BinaryObject for Department, found {}",
558 value.type_name()
559 ),
560 })
561 }94 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
95 // Try JSON object first
96 if let Ok(json_data) = value.as_json_object() {
97 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
98 field: field_name.to_string(),
99 message: format!("Failed to deserialize VersionedData from JSON: {}", e),
100 });
101 }
102
103 // Try binary object
104 if let Ok(binary_data) = value.as_binary_object() {
105 return Self::from_binary(binary_data).map_err(|e| {
106 SerializationError::ValidationFailed {
107 field: field_name.to_string(),
108 message: format!("Failed to deserialize VersionedData from binary: {}", e),
109 }
110 });
111 }
112
113 Err(SerializationError::ValidationFailed {
114 field: field_name.to_string(),
115 message: format!(
116 "Expected JsonObject or BinaryObject for VersionedData, found {}",
117 value.type_name()
118 ),
119 })
120 }
121}
122
123/// Validated user input with constraints
124#[derive(Debug, Clone, PartialEq)]
125pub struct ValidatedUserInput {
126 pub username: String,
127 pub email: String,
128 pub age: u16,
129 pub preferences: HashMap<String, String>,
130}
131
132impl StructSerializable for ValidatedUserInput {
133 fn to_serializer(&self) -> StructSerializer {
134 StructSerializer::new()
135 .field("username", &self.username)
136 .field("email", &self.email)
137 .field("age", &self.age)
138 .field("preferences", &self.preferences)
139 }
140
141 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
142 let username: String = deserializer.field("username")?;
143 let email: String = deserializer.field("email")?;
144 let age: u16 = deserializer.field("age")?;
145 let preferences: HashMap<String, String> = deserializer.field("preferences")?;
146
147 // Validate username
148 if username.is_empty() || username.len() > 50 {
149 return Err(SerializationError::ValidationFailed {
150 field: "username".to_string(),
151 message: "Username must be 1-50 characters long".to_string(),
152 });
153 }
154
155 if !username
156 .chars()
157 .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
158 {
159 return Err(SerializationError::ValidationFailed {
160 field: "username".to_string(),
161 message:
162 "Username can only contain alphanumeric characters, underscores, and hyphens"
163 .to_string(),
164 });
165 }
166
167 // Validate email (basic check)
168 if !email.contains('@') || !email.contains('.') || email.len() < 5 {
169 return Err(SerializationError::ValidationFailed {
170 field: "email".to_string(),
171 message: "Invalid email format".to_string(),
172 });
173 }
174
175 // Validate age
176 if !(13..=120).contains(&age) {
177 return Err(SerializationError::ValidationFailed {
178 field: "age".to_string(),
179 message: "Age must be between 13 and 120".to_string(),
180 });
181 }
182
183 // Validate preferences
184 if preferences.len() > 20 {
185 return Err(SerializationError::ValidationFailed {
186 field: "preferences".to_string(),
187 message: "Too many preferences (maximum 20)".to_string(),
188 });
189 }
190
191 for (key, value) in &preferences {
192 if key.len() > 50 || value.len() > 200 {
193 return Err(SerializationError::ValidationFailed {
194 field: "preferences".to_string(),
195 message: format!("Preference key/value too long: {}", key),
196 });
197 }
198 }
199
200 Ok(ValidatedUserInput {
201 username,
202 email,
203 age,
204 preferences,
205 })
206 }
207}
208
209impl ToFieldValue for ValidatedUserInput {
210 fn to_field_value(&self) -> FieldValue {
211 match self.to_json() {
212 Ok(json_str) => FieldValue::from_json_object(json_str),
213 Err(_) => FieldValue::from_string("serialization_error".to_string()),
214 }
215 }
216}
217
218impl FromFieldValue for ValidatedUserInput {
219 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
220 // Try JSON object first
221 if let Ok(json_data) = value.as_json_object() {
222 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
223 field: field_name.to_string(),
224 message: format!("Failed to deserialize ValidatedUserInput from JSON: {}", e),
225 });
226 }
227
228 // Try binary object
229 if let Ok(binary_data) = value.as_binary_object() {
230 return Self::from_binary(binary_data).map_err(|e| {
231 SerializationError::ValidationFailed {
232 field: field_name.to_string(),
233 message: format!(
234 "Failed to deserialize ValidatedUserInput from binary: {}",
235 e
236 ),
237 }
238 });
239 }
240
241 Err(SerializationError::ValidationFailed {
242 field: field_name.to_string(),
243 message: format!(
244 "Expected JsonObject or BinaryObject for ValidatedUserInput, found {}",
245 value.type_name()
246 ),
247 })
248 }
249}
250
251/// Recovery helper for handling partial data
252#[derive(Debug, Clone, PartialEq)]
253pub struct RecoverableData {
254 pub critical_field: String,
255 pub important_field: Option<String>,
256 pub optional_field: Option<String>,
257 pub metadata: HashMap<String, String>,
258}
259
260impl StructSerializable for RecoverableData {
261 fn to_serializer(&self) -> StructSerializer {
262 StructSerializer::new()
263 .field("critical_field", &self.critical_field)
264 .field("important_field", &self.important_field)
265 .field("optional_field", &self.optional_field)
266 .field("metadata", &self.metadata)
267 }
268
269 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
270 // Critical field - must exist
271 let critical_field = deserializer.field("critical_field")?;
272
273 // Important field - try to recover if missing
274 let important_field = deserializer.field_optional("important_field")?;
275
276 // Optional field - graceful fallback
277 let optional_field = deserializer.field_optional("optional_field")?;
278
279 // Metadata - recover what we can
280 let metadata = deserializer.field_or("metadata", HashMap::new())?;
281
282 Ok(RecoverableData {
283 critical_field,
284 important_field,
285 optional_field,
286 metadata,
287 })
288 }
289}
290
291impl ToFieldValue for RecoverableData {
292 fn to_field_value(&self) -> FieldValue {
293 match self.to_json() {
294 Ok(json_str) => FieldValue::from_json_object(json_str),
295 Err(_) => FieldValue::from_string("serialization_error".to_string()),
296 }
297 }
298}
299
300impl FromFieldValue for RecoverableData {
301 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
302 // Try JSON object first
303 if let Ok(json_data) = value.as_json_object() {
304 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
305 field: field_name.to_string(),
306 message: format!("Failed to deserialize RecoverableData from JSON: {}", e),
307 });
308 }
309
310 // Try binary object
311 if let Ok(binary_data) = value.as_binary_object() {
312 return Self::from_binary(binary_data).map_err(|e| {
313 SerializationError::ValidationFailed {
314 field: field_name.to_string(),
315 message: format!("Failed to deserialize RecoverableData from binary: {}", e),
316 }
317 });
318 }
319
320 Err(SerializationError::ValidationFailed {
321 field: field_name.to_string(),
322 message: format!(
323 "Expected JsonObject or BinaryObject for RecoverableData, found {}",
324 value.type_name()
325 ),
326 })
327 }87 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
88 // Try JSON object first
89 if let Ok(json_data) = value.as_json_object() {
90 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
91 field: field_name.to_string(),
92 message: format!("Failed to deserialize PerformanceMetrics from JSON: {}", e),
93 });
94 }
95
96 // Try binary object
97 if let Ok(binary_data) = value.as_binary_object() {
98 return Self::from_binary(binary_data).map_err(|e| {
99 SerializationError::ValidationFailed {
100 field: field_name.to_string(),
101 message: format!(
102 "Failed to deserialize PerformanceMetrics from binary: {}",
103 e
104 ),
105 }
106 });
107 }
108
109 Err(SerializationError::ValidationFailed {
110 field: field_name.to_string(),
111 message: format!(
112 "Expected JsonObject or BinaryObject for PerformanceMetrics, found {}",
113 value.type_name()
114 ),
115 })
116 }
117}
118
119/// Large dataset for performance testing
120#[derive(Debug, Clone, PartialEq)]
121pub struct LargeDataset {
122 pub name: String,
123 pub values: Vec<f32>, // Changed from f64 to f32 (supported)
124 pub labels: Vec<String>,
125 pub feature_count: usize, // Simplified from Vec<Vec<f32>> to just a count
126 pub feature_dimension: usize, // Store dimensions separately
127 pub metadata: HashMap<String, String>,
128 pub timestamp_count: usize, // Simplified from Vec<u64> to just count
129}
130
131impl StructSerializable for LargeDataset {
132 fn to_serializer(&self) -> StructSerializer {
133 StructSerializer::new()
134 .field("name", &self.name)
135 .field("values", &self.values)
136 .field("labels", &self.labels)
137 .field("feature_count", &self.feature_count)
138 .field("feature_dimension", &self.feature_dimension)
139 .field("metadata", &self.metadata)
140 .field("timestamp_count", &self.timestamp_count)
141 }
142
143 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
144 let name = deserializer.field("name")?;
145 let values = deserializer.field("values")?;
146 let labels = deserializer.field("labels")?;
147 let feature_count = deserializer.field("feature_count")?;
148 let feature_dimension = deserializer.field("feature_dimension")?;
149 let metadata = deserializer.field("metadata")?;
150 let timestamp_count = deserializer.field("timestamp_count")?;
151
152 Ok(LargeDataset {
153 name,
154 values,
155 labels,
156 feature_count,
157 feature_dimension,
158 metadata,
159 timestamp_count,
160 })
161 }
162}
163
164impl ToFieldValue for LargeDataset {
165 fn to_field_value(&self) -> FieldValue {
166 match self.to_json() {
167 Ok(json_str) => FieldValue::from_json_object(json_str),
168 Err(_) => FieldValue::from_string("serialization_error".to_string()),
169 }
170 }
171}
172
173impl FromFieldValue for LargeDataset {
174 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
175 // Try JSON object first
176 if let Ok(json_data) = value.as_json_object() {
177 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
178 field: field_name.to_string(),
179 message: format!("Failed to deserialize LargeDataset from JSON: {}", e),
180 });
181 }
182
183 // Try binary object
184 if let Ok(binary_data) = value.as_binary_object() {
185 return Self::from_binary(binary_data).map_err(|e| {
186 SerializationError::ValidationFailed {
187 field: field_name.to_string(),
188 message: format!("Failed to deserialize LargeDataset from binary: {}", e),
189 }
190 });
191 }
192
193 Err(SerializationError::ValidationFailed {
194 field: field_name.to_string(),
195 message: format!(
196 "Expected JsonObject or BinaryObject for LargeDataset, found {}",
197 value.type_name()
198 ),
199 })
200 }
201}
202
203/// Configuration data (typical JSON use case)
204#[derive(Debug, Clone, PartialEq)]
205pub struct Configuration {
206 pub version: String,
207 pub debug_enabled: bool,
208 pub log_level: String,
209 pub database_settings: HashMap<String, String>,
210 pub feature_flags_enabled: bool, // Simplified from HashMap<String, bool>
211 pub max_connections: f32, // Simplified from HashMap<String, f64>
212 pub timeout_seconds: f32,
213}
214
215impl StructSerializable for Configuration {
216 fn to_serializer(&self) -> StructSerializer {
217 StructSerializer::new()
218 .field("version", &self.version)
219 .field("debug_enabled", &self.debug_enabled)
220 .field("log_level", &self.log_level)
221 .field("database_settings", &self.database_settings)
222 .field("feature_flags_enabled", &self.feature_flags_enabled)
223 .field("max_connections", &self.max_connections)
224 .field("timeout_seconds", &self.timeout_seconds)
225 }
226
227 fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
228 let version = deserializer.field("version")?;
229 let debug_enabled = deserializer.field("debug_enabled")?;
230 let log_level = deserializer.field("log_level")?;
231 let database_settings = deserializer.field("database_settings")?;
232 let feature_flags_enabled = deserializer.field("feature_flags_enabled")?;
233 let max_connections = deserializer.field("max_connections")?;
234 let timeout_seconds = deserializer.field("timeout_seconds")?;
235
236 Ok(Configuration {
237 version,
238 debug_enabled,
239 log_level,
240 database_settings,
241 feature_flags_enabled,
242 max_connections,
243 timeout_seconds,
244 })
245 }
246}
247
248impl ToFieldValue for Configuration {
249 fn to_field_value(&self) -> FieldValue {
250 match self.to_json() {
251 Ok(json_str) => FieldValue::from_json_object(json_str),
252 Err(_) => FieldValue::from_string("serialization_error".to_string()),
253 }
254 }
255}
256
257impl FromFieldValue for Configuration {
258 fn from_field_value(value: FieldValue, field_name: &str) -> SerializationResult<Self> {
259 // Try JSON object first
260 if let Ok(json_data) = value.as_json_object() {
261 return Self::from_json(json_data).map_err(|e| SerializationError::ValidationFailed {
262 field: field_name.to_string(),
263 message: format!("Failed to deserialize Configuration from JSON: {}", e),
264 });
265 }
266
267 // Try binary object
268 if let Ok(binary_data) = value.as_binary_object() {
269 return Self::from_binary(binary_data).map_err(|e| {
270 SerializationError::ValidationFailed {
271 field: field_name.to_string(),
272 message: format!("Failed to deserialize Configuration from binary: {}", e),
273 }
274 });
275 }
276
277 Err(SerializationError::ValidationFailed {
278 field: field_name.to_string(),
279 message: format!(
280 "Expected JsonObject or BinaryObject for Configuration, found {}",
281 value.type_name()
282 ),
283 })
284 }Trait Implementations§
Source§impl Clone for FieldValue
impl Clone for FieldValue
Source§fn clone(&self) -> FieldValue
fn clone(&self) -> FieldValue
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more