readme_sync/
codemap_files.rs

1use std::collections::HashMap;
2use std::sync::Arc;
3
4use crate::{File, FileDocs};
5
6/// Storage for codemap and corresponding codemap files.
7#[derive(Debug, Default)]
8pub struct CodemapFiles {
9    codemap: codemap::CodeMap,
10    files: HashMap<Arc<File>, Arc<codemap::File>>,
11    file_docs: HashMap<Arc<FileDocs>, Arc<codemap::File>>,
12}
13
14impl CodemapFiles {
15    /// Creates a new codemap files storage.
16    pub fn new() -> Self {
17        Self::default()
18    }
19
20    /// Returns codemap.
21    pub fn codemap(&self) -> &codemap::CodeMap {
22        &self.codemap
23    }
24
25    /// Returns readme and documentation files.
26    pub fn files(&self) -> &HashMap<Arc<File>, Arc<codemap::File>> {
27        &self.files
28    }
29
30    /// Returns parsed documentation collection.
31    pub fn file_docs(&self) -> &HashMap<Arc<FileDocs>, Arc<codemap::File>> {
32        &self.file_docs
33    }
34
35    /// Inserts the given file into the storage if it is not present, then returns a reference to the appropriate file from codemap.
36    pub fn get_or_insert_codemap_file(&mut self, file: &Arc<File>) -> &Arc<codemap::File> {
37        use std::string::ToString;
38
39        let codemap = &mut self.codemap;
40        self.files.entry(Arc::clone(file)).or_insert_with(|| {
41            let path = file.path().to_string_lossy().into_owned();
42            codemap.add_file(path, file.text().to_string())
43        })
44    }
45
46    /// Inserts the given documentation into the storage if it is not present, then returns a reference to the appropriate file from codemap.
47    pub fn get_or_insert_codemap_docs_file(
48        &mut self,
49        file_docs: &Arc<FileDocs>,
50    ) -> &Arc<codemap::File> {
51        use std::string::ToString;
52
53        let codemap = &mut self.codemap;
54        self.file_docs
55            .entry(Arc::clone(file_docs))
56            .or_insert_with(|| {
57                let path = file_docs.file().path().to_string_lossy().into_owned() + "/parsed";
58                codemap.add_file(path, file_docs.docs().to_string())
59            })
60    }
61}