sos_client/source/
root.rs

1use std::collections::BTreeMap;
2use std::path::{Path, PathBuf};
3
4use super::base::SourceTrait;
5#[cfg(feature = "look-ahead")]
6use super::look_ahead_yes::PrebuiltData;
7use crate::error::*;
8
9pub struct SourceRoot<V, Imp>
10where
11    Imp: SourceTrait,
12{
13    #[cfg(feature = "look-ahead")]
14    pub(super) prebuilt: PrebuiltData<Imp::PrebuiltCode>,
15
16    pub(super) data: BTreeMap<String, V>,
17    pub(super) root: PathBuf,
18    pub(super) imp: Imp,
19}
20
21impl<V, Imp> SourceRoot<V, Imp>
22where
23    Imp: SourceTrait,
24{
25    pub(super) fn new(root: &Path, imp: Imp) -> Result<Self> {
26        Ok(Self {
27            #[cfg(feature = "look-ahead")]
28            prebuilt: PrebuiltData::load(root, &imp),
29            data: BTreeMap::new(),
30            root: root.to_owned(),
31            imp,
32        })
33    }
34}
35
36impl<V, Imp> SourceRoot<V, Imp>
37where
38    Imp: SourceTrait<Code = V>,
39{
40    pub fn find<'a, K: AsRef<str>>(&'a mut self, key: K) -> Result<Option<&'a V>> {
41        let key = key.as_ref();
42        self.ensure_compiled(key)?;
43        Ok(self.data.get(key))
44    }
45
46    pub fn find_mut<K: AsRef<str>>(&mut self, key: K) -> Result<Option<&mut V>> {
47        let key = key.as_ref();
48        self.ensure_compiled(key)?;
49        Ok(self.data.get_mut(key))
50    }
51
52    fn ensure_compiled(&mut self, key: &str) -> Result<()> {
53        if self.data.contains_key(key) {
54            Ok(())
55        } else {
56            self.compile(key)
57        }
58    }
59}