nested_structures/
nested_structures.rs

1//! Nested Structures Serialization Example
2//!
3//! This example demonstrates complex serialization patterns with nested structures:
4//! - Hierarchical data structures with multiple nesting levels
5//! - Structs containing other serializable structs
6//! - Collections of complex objects
7//! - Advanced field relationships and dependencies
8//! - Performance considerations for deep nesting
9//!
10//! # Learning Objectives
11//!
12//! - Understand nested struct serialization patterns
13//! - Learn to handle complex object hierarchies
14//! - Master collection serialization with custom types
15//! - Explore performance implications of deep nesting
16//! - Implement validation for complex data relationships
17//!
18//! # Prerequisites
19//!
20//! - Understanding of basic struct serialization (see basic_structs.rs)
21//! - Knowledge of Rust collections (Vec, HashMap)
22//! - Familiarity with nested data structures
23//!
24//! # Usage
25//!
26//! ```bash
27//! cargo run --example nested_structures
28//! ```
29
30use std::{collections::HashMap, fs};
31use train_station::serialization::{
32    FieldValue, FromFieldValue, SerializationError, SerializationResult, StructDeserializer,
33    StructSerializable, StructSerializer, ToFieldValue,
34};
35
36/// Contact information struct
37#[derive(Debug, Clone, PartialEq)]
38pub struct ContactInfo {
39    pub email: String,
40    pub phone: Option<String>,
41    pub address_city: String,
42    pub address_state: String,
43    pub social_media: HashMap<String, String>,
44}
45
46impl StructSerializable for ContactInfo {
47    fn to_serializer(&self) -> StructSerializer {
48        StructSerializer::new()
49            .field("email", &self.email)
50            .field("phone", &self.phone)
51            .field("address_city", &self.address_city)
52            .field("address_state", &self.address_state)
53            .field("social_media", &self.social_media)
54    }
55
56    fn from_deserializer(deserializer: &mut StructDeserializer) -> SerializationResult<Self> {
57        let email = deserializer.field("email")?;
58        let phone = deserializer.field("phone")?;
59        let address_city = deserializer.field("address_city")?;
60        let address_state = deserializer.field("address_state")?;
61        let social_media = deserializer.field("social_media")?;
62
63        Ok(ContactInfo {
64            email,
65            phone,
66            address_city,
67            address_state,
68            social_media,
69        })
70    }
71}
72
73impl ToFieldValue for ContactInfo {
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    }
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    }
562}
563
564fn main() -> Result<(), Box<dyn std::error::Error>> {
565    println!("=== Nested Structures Serialization Example ===\n");
566
567    demonstrate_nested_struct_creation()?;
568    demonstrate_deep_serialization()?;
569    demonstrate_collection_nesting()?;
570    demonstrate_partial_loading()?;
571    demonstrate_performance_analysis()?;
572    cleanup_temp_files()?;
573
574    println!("\n=== Example completed successfully! ===");
575    Ok(())
576}
577
578/// Demonstrate creating complex nested structures
579fn demonstrate_nested_struct_creation() -> Result<(), Box<dyn std::error::Error>> {
580    println!("--- Nested Structure Creation ---");
581
582    // Create nested address and contact info
583    let headquarters = Address {
584        street: "123 Innovation Drive".to_string(),
585        city: "Tech City".to_string(),
586        state: "CA".to_string(),
587        postal_code: "94000".to_string(),
588        country: "USA".to_string(),
589    };
590
591    let mut social_media = HashMap::new();
592    social_media.insert("twitter".to_string(), "@techcorp".to_string());
593    social_media.insert("linkedin".to_string(), "techcorp-inc".to_string());
594
595    let contact_info = ContactInfo {
596        email: "info@techcorp.com".to_string(),
597        phone: Some("+1-555-0123".to_string()),
598        address_city: headquarters.city.clone(),
599        address_state: headquarters.state.clone(),
600        social_media,
601    };
602
603    // Create departments with nested office locations
604    let engineering_office = Address {
605        street: "456 Developer Lane".to_string(),
606        city: "Code City".to_string(),
607        state: "CA".to_string(),
608        postal_code: "94001".to_string(),
609        country: "USA".to_string(),
610    };
611
612    let departments = [
613        Department {
614            name: "Engineering".to_string(),
615            manager: "Alice Johnson".to_string(),
616            employee_count: 50,
617            budget: 2500000.0,
618            office_locations: vec![engineering_office, headquarters.clone()],
619        },
620        Department {
621            name: "Marketing".to_string(),
622            manager: "Bob Smith".to_string(),
623            employee_count: 15,
624            budget: 800000.0,
625            office_locations: vec![headquarters.clone()],
626        },
627    ];
628
629    // Create projects with milestones
630    let milestones = vec![
631        Milestone {
632            name: "Requirements Analysis".to_string(),
633            description: "Complete system requirements documentation".to_string(),
634            due_date: "2024-03-15".to_string(),
635            is_completed: true,
636            progress_percentage: 100.0,
637            dependencies: vec![],
638        },
639        Milestone {
640            name: "Architecture Design".to_string(),
641            description: "Define system architecture and components".to_string(),
642            due_date: "2024-04-01".to_string(),
643            is_completed: false,
644            progress_percentage: 75.0,
645            dependencies: vec!["Requirements Analysis".to_string()],
646        },
647    ];
648
649    let mut project_metadata = HashMap::new();
650    project_metadata.insert("priority".to_string(), "high".to_string());
651    project_metadata.insert("client".to_string(), "internal".to_string());
652
653    let projects = [Project {
654        name: "Train Station ML Platform".to_string(),
655        description: "Next-generation machine learning infrastructure".to_string(),
656        status: ProjectStatus::InProgress,
657        budget: 1500000.0,
658        team_members: vec![
659            "Alice Johnson".to_string(),
660            "Charlie Brown".to_string(),
661            "Diana Prince".to_string(),
662        ],
663        milestones: milestones.clone(),
664        metadata: project_metadata,
665    }];
666
667    // Create the complete company structure
668    let mut company_metadata = HashMap::new();
669    company_metadata.insert("industry".to_string(), "technology".to_string());
670    company_metadata.insert("stock_symbol".to_string(), "TECH".to_string());
671
672    let company = Company {
673        name: "TechCorp Inc.".to_string(),
674        founded_year: 2015,
675        headquarters_city: headquarters.city.clone(),
676        headquarters_state: headquarters.state.clone(),
677        employee_count: 250,
678        department_names: departments.iter().map(|d| d.name.clone()).collect(),
679        active_project_names: projects.iter().map(|p| p.name.clone()).collect(),
680        company_metadata,
681    };
682
683    println!("Created complex company structure:");
684    println!("  Company: {}", company.name);
685    println!("  Founded: {}", company.founded_year);
686    println!(
687        "  Headquarters: {}, {}",
688        company.headquarters_city, company.headquarters_state
689    );
690    println!("  Employee Count: {}", company.employee_count);
691    println!("  Departments: {}", company.department_names.len());
692    println!("  Active Projects: {}", company.active_project_names.len());
693
694    // Save the complete structure
695    company.save_json("temp_nested_company.json")?;
696    println!("Saved nested structure to: temp_nested_company.json");
697
698    // Verify loading preserves all nested data
699    let loaded_company = Company::load_json("temp_nested_company.json")?;
700    assert_eq!(company, loaded_company);
701    println!("Successfully verified Company roundtrip serialization");
702
703    // Also demonstrate individual component serialization
704    let address_json = headquarters.to_json()?;
705    let loaded_address = Address::from_json(&address_json)?;
706    assert_eq!(headquarters, loaded_address);
707    println!("Successfully serialized/deserialized Address component");
708
709    let contact_json = contact_info.to_json()?;
710    let loaded_contact = ContactInfo::from_json(&contact_json)?;
711    assert_eq!(contact_info, loaded_contact);
712    println!("Successfully serialized/deserialized ContactInfo component");
713    println!("Nested structure integrity: VERIFIED");
714
715    Ok(())
716}
717
718/// Demonstrate deep serialization with complex nesting
719fn demonstrate_deep_serialization() -> Result<(), Box<dyn std::error::Error>> {
720    println!("\n--- Deep Serialization Analysis ---");
721
722    let deep_milestone = Milestone {
723        name: "Deep Milestone".to_string(),
724        description: "Testing deep nesting serialization".to_string(),
725        due_date: "2024-12-31".to_string(),
726        is_completed: false,
727        progress_percentage: 50.0,
728        dependencies: vec!["Parent Task".to_string(), "Sibling Task".to_string()],
729    };
730
731    let deep_project = Project {
732        name: "Deep Nesting Test".to_string(),
733        description: "Project for testing serialization depth".to_string(),
734        status: ProjectStatus::Planning,
735        budget: 100000.0,
736        team_members: vec!["Developer 1".to_string(), "Developer 2".to_string()],
737        milestones: vec![deep_milestone],
738        metadata: HashMap::new(),
739    };
740
741    // Analyze serialization output
742    let json_output = deep_project.to_json()?;
743    let binary_output = deep_project.to_binary()?;
744
745    println!("Deep structure serialization analysis:");
746    println!("  JSON size: {} bytes", json_output.len());
747    println!("  Binary size: {} bytes", binary_output.len());
748    println!("  Nesting levels: Address -> Project -> Milestone -> Dependencies");
749
750    // Count nested objects in JSON (rough estimate)
751    let object_count = json_output.matches('{').count();
752    let array_count = json_output.matches('[').count();
753    println!("  JSON objects: {}", object_count);
754    println!("  JSON arrays: {}", array_count);
755
756    // Verify deep roundtrip
757    let json_parsed = Project::from_json(&json_output)?;
758    let binary_parsed = Project::from_binary(&binary_output)?;
759
760    assert_eq!(deep_project, json_parsed);
761    assert_eq!(deep_project, binary_parsed);
762    println!("Deep serialization roundtrip: VERIFIED");
763
764    Ok(())
765}
766
767/// Demonstrate collection nesting patterns
768fn demonstrate_collection_nesting() -> Result<(), Box<dyn std::error::Error>> {
769    println!("\n--- Collection Nesting Patterns ---");
770
771    // Create multiple departments with varying complexity
772    let departments = vec![
773        Department {
774            name: "Research".to_string(),
775            manager: "Dr. Science".to_string(),
776            employee_count: 25,
777            budget: 1200000.0,
778            office_locations: vec![
779                Address {
780                    street: "1 Research Blvd".to_string(),
781                    city: "Innovation Hub".to_string(),
782                    state: "MA".to_string(),
783                    postal_code: "02101".to_string(),
784                    country: "USA".to_string(),
785                },
786                Address {
787                    street: "2 Lab Street".to_string(),
788                    city: "Tech Valley".to_string(),
789                    state: "NY".to_string(),
790                    postal_code: "12180".to_string(),
791                    country: "USA".to_string(),
792                },
793            ],
794        },
795        Department {
796            name: "Quality Assurance".to_string(),
797            manager: "Test Master".to_string(),
798            employee_count: 12,
799            budget: 600000.0,
800            office_locations: vec![], // Empty collection
801        },
802    ];
803
804    println!("Collection nesting analysis:");
805    println!("  Departments: {}", departments.len());
806
807    let total_locations: usize = departments.iter().map(|d| d.office_locations.len()).sum();
808    println!("  Total office locations: {}", total_locations);
809
810    // Test serialization with mixed empty and populated collections
811    // Note: Vec<Department> doesn't implement StructSerializable directly.
812    // For this example, we'll serialize each department individually
813    let department_json_strings: Result<Vec<String>, _> =
814        departments.iter().map(|dept| dept.to_json()).collect();
815    let department_json_strings = department_json_strings?;
816
817    // Deserialize each department back
818    let parsed_departments: Result<Vec<Department>, _> = department_json_strings
819        .iter()
820        .map(|json_str| Department::from_json(json_str))
821        .collect();
822    let parsed_departments = parsed_departments?;
823
824    assert_eq!(departments, parsed_departments);
825    println!("Collection nesting serialization: VERIFIED");
826
827    // Analyze collection patterns
828    for (i, dept) in departments.iter().enumerate() {
829        println!(
830            "  Department {}: {} locations",
831            i + 1,
832            dept.office_locations.len()
833        );
834    }
835
836    Ok(())
837}
838
839/// Demonstrate partial loading and field access
840fn demonstrate_partial_loading() -> Result<(), Box<dyn std::error::Error>> {
841    println!("\n--- Partial Loading and Field Access ---");
842
843    // Create a simple project for analysis
844    let project = Project {
845        name: "Sample Project".to_string(),
846        description: "For testing partial loading".to_string(),
847        status: ProjectStatus::InProgress,
848        budget: 50000.0,
849        team_members: vec!["Alice".to_string(), "Bob".to_string()],
850        milestones: vec![Milestone {
851            name: "Phase 1".to_string(),
852            description: "Initial phase".to_string(),
853            due_date: "2024-06-01".to_string(),
854            is_completed: true,
855            progress_percentage: 100.0,
856            dependencies: vec![],
857        }],
858        metadata: HashMap::new(),
859    };
860
861    // Convert to JSON and analyze structure
862    println!("Project JSON structure analysis:");
863
864    // Parse to examine available fields by inspecting JSON structure
865    let json_data = project.to_json()?;
866    let field_count = json_data.matches(':').count();
867    println!("  Estimated fields: {}", field_count);
868
869    // Show top-level structure
870    let lines: Vec<&str> = json_data.lines().take(10).collect();
871    println!("  JSON structure preview:");
872    for line in lines.iter().take(5) {
873        if let Some(colon_pos) = line.find(':') {
874            let field_name = line[..colon_pos].trim().trim_matches('"').trim();
875            if !field_name.is_empty() {
876                println!("    - {}", field_name);
877            }
878        }
879    }
880
881    // Demonstrate field type analysis
882    println!("\nField type analysis:");
883    println!("  name: String");
884    println!("  status: Enum -> String");
885    println!("  budget: f64 -> Number");
886    println!("  team_members: Vec<String> -> Array");
887    println!("  milestones: Vec<Milestone> -> Array of Objects");
888
889    Ok(())
890}
891
892/// Demonstrate performance analysis for nested structures
893fn demonstrate_performance_analysis() -> Result<(), Box<dyn std::error::Error>> {
894    println!("\n--- Performance Analysis ---");
895
896    // Create structures of varying complexity
897    let simple_address = Address {
898        street: "123 Main St".to_string(),
899        city: "Anytown".to_string(),
900        state: "ST".to_string(),
901        postal_code: "12345".to_string(),
902        country: "USA".to_string(),
903    };
904
905    let complex_department = Department {
906        name: "Complex Department".to_string(),
907        manager: "Manager Name".to_string(),
908        employee_count: 100,
909        budget: 5000000.0,
910        office_locations: vec![simple_address.clone(); 10], // 10 identical addresses
911    };
912
913    let complex_project = Project {
914        name: "Complex Project".to_string(),
915        description: "Large project with many components".to_string(),
916        status: ProjectStatus::InProgress,
917        budget: 2000000.0,
918        team_members: (1..=50).map(|i| format!("Team Member {}", i)).collect(),
919        milestones: (1..=20)
920            .map(|i| Milestone {
921                name: format!("Milestone {}", i),
922                description: format!("Description for milestone {}", i),
923                due_date: "2024-12-31".to_string(),
924                is_completed: i <= 10,
925                progress_percentage: if i <= 10 { 100.0 } else { 50.0 },
926                dependencies: if i > 1 {
927                    vec![format!("Milestone {}", i - 1)]
928                } else {
929                    vec![]
930                },
931            })
932            .collect(),
933        metadata: HashMap::new(),
934    };
935
936    // Measure serialization performance
937    println!("Performance comparison:");
938
939    // Simple address
940    let addr_json = simple_address.to_json()?;
941    let addr_binary = simple_address.to_binary()?;
942    println!("  Simple Address:");
943    println!("    JSON: {} bytes", addr_json.len());
944    println!("    Binary: {} bytes", addr_binary.len());
945
946    // Complex department
947    let dept_json = complex_department.to_json()?;
948    let dept_binary = complex_department.to_binary()?;
949    println!("  Complex Department (10 addresses):");
950    println!("    JSON: {} bytes", dept_json.len());
951    println!("    Binary: {} bytes", dept_binary.len());
952
953    // Complex project
954    let proj_json = complex_project.to_json()?;
955    let proj_binary = complex_project.to_binary()?;
956    println!("  Complex Project (50 members, 20 milestones):");
957    println!("    JSON: {} bytes", proj_json.len());
958    println!("    Binary: {} bytes", proj_binary.len());
959
960    // Calculate efficiency ratios
961    let dept_ratio = dept_json.len() as f64 / dept_binary.len() as f64;
962    let proj_ratio = proj_json.len() as f64 / proj_binary.len() as f64;
963
964    println!("\nFormat efficiency (JSON/Binary ratio):");
965    println!("  Department: {:.2}x", dept_ratio);
966    println!("  Project: {:.2}x", proj_ratio);
967
968    // Verify complex structure roundtrip
969    let proj_json_parsed = Project::from_json(&proj_json)?;
970    let proj_binary_parsed = Project::from_binary(&proj_binary)?;
971
972    assert_eq!(complex_project, proj_json_parsed);
973    assert_eq!(complex_project, proj_binary_parsed);
974    println!("Complex structure roundtrip: VERIFIED");
975
976    Ok(())
977}
978
979/// Clean up temporary files created during the example
980fn cleanup_temp_files() -> Result<(), Box<dyn std::error::Error>> {
981    println!("\n--- Cleanup ---");
982
983    let files_to_remove = ["temp_nested_company.json"];
984
985    for file in &files_to_remove {
986        if fs::metadata(file).is_ok() {
987            fs::remove_file(file)?;
988            println!("Removed: {}", file);
989        }
990    }
991
992    println!("Cleanup completed");
993    Ok(())
994}
995
996#[cfg(test)]
997mod tests {
998    use super::*;
999
1000    #[test]
1001    fn test_address_serialization() {
1002        let address = Address {
1003            street: "123 Test St".to_string(),
1004            city: "Test City".to_string(),
1005            state: "TS".to_string(),
1006            postal_code: "12345".to_string(),
1007            country: "Test Country".to_string(),
1008        };
1009
1010        let json_data = address.to_json().unwrap();
1011        let parsed_address = Address::from_json(&json_data).unwrap();
1012        assert_eq!(address, parsed_address);
1013    }
1014
1015    #[test]
1016    fn test_project_status_enum() {
1017        let statuses = vec![
1018            ProjectStatus::Planning,
1019            ProjectStatus::InProgress,
1020            ProjectStatus::OnHold,
1021            ProjectStatus::Completed,
1022            ProjectStatus::Cancelled,
1023        ];
1024
1025        for status in statuses {
1026            let field_value = status.to_field_value();
1027            let parsed_status = ProjectStatus::from_field_value(field_value, "status").unwrap();
1028            assert_eq!(status, parsed_status);
1029        }
1030    }
1031
1032    #[test]
1033    fn test_nested_company_structure() {
1034        let address = Address {
1035            street: "Test St".to_string(),
1036            city: "Test City".to_string(),
1037            state: "TS".to_string(),
1038            postal_code: "12345".to_string(),
1039            country: "Test".to_string(),
1040        };
1041
1042        let contact_info = ContactInfo {
1043            email: "test@test.com".to_string(),
1044            phone: None,
1045            address_city: address.city.clone(),
1046            address_state: address.state.clone(),
1047            social_media: HashMap::new(),
1048        };
1049
1050        let company = Company {
1051            name: "Test Company".to_string(),
1052            founded_year: 2020,
1053            headquarters_city: address.city.clone(),
1054            headquarters_state: address.state.clone(),
1055            employee_count: 10,
1056            department_names: vec![],
1057            active_project_names: vec![],
1058            company_metadata: HashMap::new(),
1059        };
1060
1061        let json_data = company.to_json().unwrap();
1062        let parsed_company = Company::from_json(&json_data).unwrap();
1063        assert_eq!(company, parsed_company);
1064    }
1065
1066    #[test]
1067    fn test_milestone_with_dependencies() {
1068        let milestone = Milestone {
1069            name: "Test Milestone".to_string(),
1070            description: "Test Description".to_string(),
1071            due_date: "2024-01-01".to_string(),
1072            is_completed: false,
1073            progress_percentage: 25.0,
1074            dependencies: vec!["Dep1".to_string(), "Dep2".to_string()],
1075        };
1076
1077        let binary_data = milestone.to_binary().unwrap();
1078        let parsed_milestone = Milestone::from_binary(&binary_data).unwrap();
1079        assert_eq!(milestone, parsed_milestone);
1080    }
1081}