repair_pptx/
repair_pptx.rs1use ppt_rs::oxml::repair::{PptxRepair, RepairIssue};
10use std::fs;
11
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13 println!("PPTX Repair Example\n");
14 println!("==================\n");
15
16 use ppt_rs::generator::{create_pptx_with_content, SlideContent};
18
19 let slides = vec![
20 SlideContent::new("Sample Presentation")
21 .add_bullet("This is a sample slide")
22 .add_bullet("Created for repair demonstration"),
23 SlideContent::new("Second Slide")
24 .add_bullet("More content here"),
25 ];
26
27 let pptx_data = create_pptx_with_content("Sample", slides)?;
28 fs::write("sample_to_repair.pptx", &pptx_data)?;
29 println!("Created sample PPTX file: sample_to_repair.pptx\n");
30
31 let mut repair = PptxRepair::open("sample_to_repair.pptx")?;
33 println!("Opened PPTX file for repair\n");
34
35 println!("--- Validation ---");
37 let issues = repair.validate();
38
39 if issues.is_empty() {
40 println!("No issues found! File is valid.\n");
41 } else {
42 println!("Found {} issue(s):\n", issues.len());
43 for (i, issue) in issues.iter().enumerate() {
44 println!(" {}. [Severity {}] {}",
45 i + 1,
46 issue.severity(),
47 issue.description()
48 );
49 println!(" Repairable: {}", if issue.is_repairable() { "Yes" } else { "No" });
50 }
51 println!();
52 }
53
54 println!("--- Repair ---");
56 let result = repair.repair();
57
58 println!("Issues found: {}", result.total_issues());
59 println!("Critical issues: {}", result.critical_issues());
60 println!("Issues repaired: {}", result.issues_repaired.len());
61 println!("Issues unrepaired: {}", result.issues_unrepaired.len());
62 println!("File is now valid: {}", result.is_valid);
63 println!();
64
65 repair.save("repaired.pptx")?;
67 println!("Saved repaired file: repaired.pptx\n");
68
69 println!("--- Verification ---");
71 let mut verify = PptxRepair::open("repaired.pptx")?;
72 let verify_issues = verify.validate();
73
74 if verify_issues.is_empty() {
75 println!("Repaired file is valid!");
76 } else {
77 println!("Repaired file still has {} issue(s)", verify_issues.len());
78 }
79
80 println!("\n--- Issue Types Reference ---");
82 demonstrate_issue_types();
83
84 fs::remove_file("sample_to_repair.pptx").ok();
86 fs::remove_file("repaired.pptx").ok();
87
88 println!("\nRepair example completed successfully!");
89 Ok(())
90}
91
92fn demonstrate_issue_types() {
93 let issue_examples = vec![
94 RepairIssue::MissingPart {
95 path: "[Content_Types].xml".to_string(),
96 description: "Content types definition".to_string(),
97 },
98 RepairIssue::InvalidXml {
99 path: "ppt/slides/slide1.xml".to_string(),
100 error: "Malformed XML".to_string(),
101 },
102 RepairIssue::BrokenRelationship {
103 source: "ppt/_rels/presentation.xml.rels".to_string(),
104 target: "slides/slide99.xml".to_string(),
105 rel_id: "rId99".to_string(),
106 },
107 RepairIssue::MissingSlideReference {
108 slide_path: "ppt/slides/slide2.xml".to_string(),
109 },
110 RepairIssue::OrphanSlide {
111 slide_path: "ppt/slides/slide99.xml".to_string(),
112 },
113 ];
114
115 for issue in issue_examples {
116 println!(" - {} (Severity: {}, Repairable: {})",
117 match &issue {
118 RepairIssue::MissingPart { .. } => "MissingPart",
119 RepairIssue::InvalidXml { .. } => "InvalidXml",
120 RepairIssue::BrokenRelationship { .. } => "BrokenRelationship",
121 RepairIssue::MissingSlideReference { .. } => "MissingSlideReference",
122 RepairIssue::OrphanSlide { .. } => "OrphanSlide",
123 RepairIssue::InvalidContentType { .. } => "InvalidContentType",
124 RepairIssue::CorruptedEntry { .. } => "CorruptedEntry",
125 RepairIssue::MissingNamespace { .. } => "MissingNamespace",
126 RepairIssue::EmptyRequiredElement { .. } => "EmptyRequiredElement",
127 },
128 issue.severity(),
129 if issue.is_repairable() { "Yes" } else { "No" }
130 );
131 }
132}