FieldValue

Enum FieldValue 

Source
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 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
  • F32(f32) - 32-bit floating point numbers
  • F64(f64) - 64-bit floating point numbers
  • String(String) - UTF-8 encoded text strings

§Complex Types

  • Bytes(Vec<u8>) - Raw binary data arrays
  • JsonObject(String) - JSON-serialized object strings
  • BinaryObject(Vec<u8>) - Binary-serialized object data
  • Array(Vec<FieldValue>) - Heterogeneous value arrays
  • Optional(Option<Box<FieldValue>>) - Nullable field values
  • Object(HashMap<String, FieldValue>) - Key-value object maps
  • Enum { 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({...})) }

Fields

§variant: String

The name of the enum variant

§data: Option<Box<FieldValue>>

Optional associated data for the variant (boxed for memory efficiency)

Implementations§

Source§

impl FieldValue

Source

pub fn from_bool(value: bool) -> Self

Creates a boolean field value

§Arguments
  • value - Boolean value to store
§Returns

A FieldValue::Bool variant containing the boolean value

Source

pub fn from_i8(value: i8) -> Self

Creates an 8-bit signed integer field value

§Arguments
  • value - 8-bit signed integer to store
§Returns

A FieldValue::I8 variant containing the integer value

Source

pub fn from_i16(value: i16) -> Self

Creates a 16-bit signed integer field value

§Arguments
  • value - 16-bit signed integer to store
§Returns

A FieldValue::I16 variant containing the integer value

Source

pub fn from_i32(value: i32) -> Self

Creates a 32-bit signed integer field value

§Arguments
  • value - 32-bit signed integer to store
§Returns

A FieldValue::I32 variant containing the integer value

Source

pub fn from_i64(value: i64) -> Self

Creates a 64-bit signed integer field value

§Arguments
  • value - 64-bit signed integer to store
§Returns

A FieldValue::I64 variant containing the integer value

Source

pub fn from_u8(value: u8) -> Self

Creates an 8-bit unsigned integer field value

§Arguments
  • value - 8-bit unsigned integer to store
§Returns

A FieldValue::U8 variant containing the integer value

Source

pub fn from_u16(value: u16) -> Self

Creates a 16-bit unsigned integer field value

§Arguments
  • value - 16-bit unsigned integer to store
§Returns

A FieldValue::U16 variant containing the integer value

Source

pub fn from_u32(value: u32) -> Self

Creates a 32-bit unsigned integer field value

§Arguments
  • value - 32-bit unsigned integer to store
§Returns

A FieldValue::U32 variant containing the integer value

Source

pub fn from_u64(value: u64) -> Self

Creates a 64-bit unsigned integer field value

§Arguments
  • value - 64-bit unsigned integer to store
§Returns

A FieldValue::U64 variant containing the integer value

Source

pub fn from_usize(value: usize) -> Self

Creates a platform-specific size integer field value

§Arguments
  • value - Platform-specific size integer to store
§Returns

A FieldValue::Usize variant containing the size value

Source

pub fn from_f32(value: f32) -> Self

Creates a 32-bit floating point field value

§Arguments
  • value - 32-bit floating point number to store
§Returns

A FieldValue::F32 variant containing the float value

Source

pub fn from_f64(value: f64) -> Self

Creates a 64-bit floating point field value

§Arguments
  • value - 64-bit floating point number to store
§Returns

A FieldValue::F64 variant containing the float value

Source

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?
examples/serialization/error_handling.rs (line 88)
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
Hide additional examples
examples/serialization/json_vs_binary.rs (line 81)
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    }
examples/serialization/nested_structures.rs (line 77)
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    }
examples/serialization/basic_structs.rs (line 85)
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    }
Source

pub fn from_string_slice(value: &str) -> Self

Creates a string field value from a string slice

§Arguments
  • value - String slice to store (converted to owned string)
§Returns

A FieldValue::String variant containing the string value

Source

pub fn from_bytes(value: Vec<u8>) -> Self

Creates a byte array field value

§Arguments
  • value - Vector of bytes to store
§Returns

A FieldValue::Bytes variant containing the byte array

Source

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?
examples/serialization/error_handling.rs (line 87)
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
Hide additional examples
examples/serialization/json_vs_binary.rs (line 80)
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    }
examples/serialization/nested_structures.rs (line 76)
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    }
examples/serialization/basic_structs.rs (line 83)
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    }
Source

pub fn from_binary_object(data: Vec<u8>) -> Self

Creates a binary object field value

§Arguments
  • data - Binary data representing the serialized object
§Returns

A FieldValue::BinaryObject variant containing the binary data

Source

pub fn from_array(values: Vec<FieldValue>) -> Self

Creates an array field value

§Arguments
  • values - Vector of field values to store as an array
§Returns

A FieldValue::Array variant containing the array of values

Source

pub fn from_optional(value: Option<FieldValue>) -> Self

Creates an optional field value

§Arguments
  • value - Optional field value (None becomes Optional(None), Some(v) becomes Optional(Some(Box::new(v))))
§Returns

A FieldValue::Optional variant containing the optional value

Source

pub fn from_object(value: HashMap<String, FieldValue>) -> Self

Creates an object field value

§Arguments
  • value - HashMap of string keys to field values
§Returns

A FieldValue::Object variant containing the key-value pairs

Source

pub fn from_enum(variant: String, data: Option<FieldValue>) -> Self

Creates an enum field value with variant name and optional associated data

§Arguments
  • variant - Name of the enum variant
  • data - Optional associated data for the variant
§Returns

A FieldValue::Enum variant containing the variant name and optional data

Source

pub fn from_enum_unit(variant: String) -> Self

Creates a unit enum variant with no associated data

§Arguments
  • variant - Name of the enum variant
§Returns

A FieldValue::Enum variant with no associated data

Source

pub fn from_enum_tuple(variant: String, values: Vec<FieldValue>) -> Self

Creates a tuple enum variant with array data

§Arguments
  • variant - Name of the enum variant
  • values - Vector of field values representing the tuple data
§Returns

A FieldValue::Enum variant with array data

Source

pub fn from_enum_struct( variant: String, fields: HashMap<String, FieldValue>, ) -> Self

Creates a struct enum variant with object data

§Arguments
  • variant - Name of the enum variant
  • fields - HashMap of field names to values representing the struct data
§Returns

A FieldValue::Enum variant with object data

Source

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

Source

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

Source

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

Source

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
Source

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
Source

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

Source

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

Source

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.)
Source

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
Source

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
Source

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
Source

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
Source

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

Source

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

Source

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:

  1. Hex string with 0x prefix: "0x1234abcd"[0x12, 0x34, 0xab, 0xcd]
  2. Plain hex string: "1234abcd"[0x12, 0x34, 0xab, 0xcd]
  3. 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
Source

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?
examples/serialization/basic_structs.rs (line 93)
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
Hide additional examples
examples/serialization/nested_structures.rs (line 85)
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    }
examples/serialization/error_handling.rs (line 96)
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    }
examples/serialization/json_vs_binary.rs (line 89)
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    }
Source

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?
examples/serialization/basic_structs.rs (line 101)
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
Hide additional examples
examples/serialization/nested_structures.rs (line 93)
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    }
examples/serialization/error_handling.rs (line 104)
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    }
examples/serialization/json_vs_binary.rs (line 97)
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    }
Source

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

Source

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

Source

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

Source

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

Source

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

Source

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

Source

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?
examples/serialization/basic_structs.rs (line 114)
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
Hide additional examples
examples/serialization/nested_structures.rs (line 106)
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    }
examples/serialization/error_handling.rs (line 117)
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    }
examples/serialization/json_vs_binary.rs (line 113)
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

Source§

fn clone(&self) -> FieldValue

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FieldValue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for FieldValue

Source§

fn eq(&self, other: &FieldValue) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for FieldValue

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.