sos_client/source/
root.rs1use 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}