xml_include/
lib.rs

1pub mod error;
2mod processor;
3
4use crate::error::Result;
5use crate::processor::get_event_stream;
6use std::fs::File;
7use std::io::Cursor;
8use std::path::Path;
9use xml::EmitterConfig;
10
11/// Merge includes found in an XML file and return the result as a string.
12///
13/// The includes are resolved recursively, only "xi:includes" elements are considered.
14///
15/// # Arguments
16/// - `file_path` - the path to the XML file to resolve `xi:include` elements in
17///
18/// # Returns
19/// The resolved XML content as a string.
20pub fn resolve_xml_includes(file_path: &Path) -> Result<String> {
21    let buffer = Vec::new();
22    let cursor = Cursor::new(buffer);
23
24    let mut writer = EmitterConfig::new()
25        .perform_indent(true)
26        .create_writer(cursor);
27
28    let output = get_event_stream(&File::open(file_path)?, Some(file_path))?;
29
30    for elem in output {
31        if let Some(event) = elem.as_writer_event() {
32            writer.write(event)?;
33        }
34    }
35
36    let resolved_content = String::from_utf8(writer.into_inner().into_inner())?;
37
38    Ok(resolved_content)
39}