Skip to main content

docx_rs/reader/
document_rels.rs

1use std::collections::BTreeMap;
2use std::collections::BTreeSet;
3use std::io::Cursor;
4use std::path::*;
5
6use document_rels::rels::find_rels_filename;
7use document_rels::rels::read_rels_xml;
8
9use super::errors::*;
10use super::*;
11
12pub type RId = String;
13
14#[derive(Debug, Clone, PartialEq)]
15pub struct ReadDocumentRels {
16    rels: BTreeMap<String, BTreeSet<(RId, PathBuf, Option<String>)>>,
17}
18
19impl ReadDocumentRels {
20    pub fn find_target_path(&self, target: &str) -> Option<Vec<(RId, PathBuf, Option<String>)>> {
21        self.rels
22            .get(target)
23            .map(|s| s.clone().into_iter().collect())
24    }
25
26    pub(crate) fn target_paths(
27        &self,
28        target: &str,
29    ) -> Option<&BTreeSet<(RId, PathBuf, Option<String>)>> {
30        self.rels.get(target)
31    }
32}
33
34pub fn read_document_rels(
35    archive: &mut zip::read::ZipArchive<Cursor<&[u8]>>,
36    main_path: impl AsRef<Path>,
37) -> Result<ReadDocumentRels, ReaderError> {
38    let dir = &main_path
39        .as_ref()
40        .parent()
41        .ok_or(ReaderError::DocumentRelsNotFoundError)?;
42    let p = find_rels_filename(&main_path)?;
43    let p = p.to_str().ok_or(ReaderError::DocumentRelsNotFoundError)?;
44    let data = read_zip(archive, p)?;
45    let rels = read_rels_xml(&data[..], dir)?;
46    Ok(ReadDocumentRels { rels })
47}