docx_rs/reader/
document_rels.rs1use 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}