1use std::{collections::HashMap, fs};
31use train_station::serialization::{
32 FieldValue, FromFieldValue, SerializationError, SerializationResult, StructDeserializer,
33 StructSerializable, StructSerializer, ToFieldValue,
34};
35
36#[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 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 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#[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 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 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#[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 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 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#[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#[derive(Debug, Clone, PartialEq)]
322pub struct Milestone {
323 pub name: String,
324 pub description: String,
325 pub due_date: String, 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 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 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#[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 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 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#[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 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 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
578fn demonstrate_nested_struct_creation() -> Result<(), Box<dyn std::error::Error>> {
580 println!("--- Nested Structure Creation ---");
581
582 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 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 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 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 company.save_json("temp_nested_company.json")?;
696 println!("Saved nested structure to: temp_nested_company.json");
697
698 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 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
718fn 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 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 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 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
767fn demonstrate_collection_nesting() -> Result<(), Box<dyn std::error::Error>> {
769 println!("\n--- Collection Nesting Patterns ---");
770
771 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![], },
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 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 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 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
839fn demonstrate_partial_loading() -> Result<(), Box<dyn std::error::Error>> {
841 println!("\n--- Partial Loading and Field Access ---");
842
843 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 println!("Project JSON structure analysis:");
863
864 let json_data = project.to_json()?;
866 let field_count = json_data.matches(':').count();
867 println!(" Estimated fields: {}", field_count);
868
869 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 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
892fn demonstrate_performance_analysis() -> Result<(), Box<dyn std::error::Error>> {
894 println!("\n--- Performance Analysis ---");
895
896 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], };
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 println!("Performance comparison:");
938
939 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 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 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 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 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
979fn 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}