fob_graph/memory/
mutations.rs1use std::sync::Arc;
4
5use super::super::Module;
6use super::super::external_dep::ExternalDependency;
7use super::graph::ModuleGraph;
8use crate::Result;
9
10impl ModuleGraph {
11 pub fn add_module(&self, module: Module) -> Result<()> {
13 let mut external_deps_to_add = Vec::new();
15 for import in module.imports.iter() {
16 if import.resolved_to.is_none() && !import.source.is_empty() {
17 external_deps_to_add.push((import.source.clone(), module.id.clone()));
18 }
19 }
20
21 let mut inner = self.inner.write();
23
24 if module.is_entry {
26 inner.entry_points.insert(module.id.clone());
27 }
28
29 for (source, importer_id) in external_deps_to_add {
31 let dep = inner
32 .external_deps
33 .entry(source.clone())
34 .or_insert_with(|| ExternalDependency::new(source));
35 dep.push_importer(importer_id);
36 }
37
38 inner.modules.insert(module.id.clone(), Arc::new(module));
40
41 Ok(())
42 }
43
44 pub fn add_dependency(
46 &self,
47 from: super::super::ModuleId,
48 to: super::super::ModuleId,
49 ) -> Result<()> {
50 let mut inner = self.inner.write();
51
52 inner
54 .dependencies
55 .entry(from.clone())
56 .or_default()
57 .insert(to.clone());
58
59 inner.dependents.entry(to).or_default().insert(from);
61
62 Ok(())
63 }
64
65 pub fn add_dependencies<I>(&self, from: super::super::ModuleId, targets: I) -> Result<()>
67 where
68 I: IntoIterator<Item = super::super::ModuleId>,
69 {
70 for target in targets {
71 self.add_dependency(from.clone(), target)?;
72 }
73 Ok(())
74 }
75
76 pub fn add_entry_point(&self, id: super::super::ModuleId) -> Result<()> {
78 let mut inner = self.inner.write();
79 inner.entry_points.insert(id.clone());
80
81 if let Some(module_arc) = inner.modules.get(&id) {
83 let mut module = (**module_arc).clone();
84 module.is_entry = true;
85 inner.modules.insert(id, Arc::new(module));
86 }
87
88 Ok(())
89 }
90
91 pub fn add_external_dependency(&self, dep: ExternalDependency) -> Result<()> {
93 let mut inner = self.inner.write();
94 inner.external_deps.insert(dep.specifier.clone(), dep);
95 Ok(())
96 }
97}