Skip to main content

repair_pptx/
repair_pptx.rs

1//! Example demonstrating PPTX repair functionality
2//!
3//! This example shows how to:
4//! 1. Open a potentially damaged PPTX file
5//! 2. Validate and detect issues
6//! 3. Repair the issues
7//! 4. Save the repaired file
8
9use 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    // First, create a sample PPTX file to repair
17    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    // Open the file for repair
32    let mut repair = PptxRepair::open("sample_to_repair.pptx")?;
33    println!("Opened PPTX file for repair\n");
34
35    // Validate and find issues
36    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    // Perform repair
55    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    // Save the repaired file
66    repair.save("repaired.pptx")?;
67    println!("Saved repaired file: repaired.pptx\n");
68
69    // Verify the repaired file
70    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    // Demonstrate issue types
81    println!("\n--- Issue Types Reference ---");
82    demonstrate_issue_types();
83
84    // Cleanup
85    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}