assemble_core/startup/
initialization.rs1mod descriptor;
3mod settings;
4
5use crate::private::Sealed;
6use crate::project::shared::SharedProject;
7use crate::project::ProjectResult;
8use crate::Project;
9pub use descriptor::*;
10use parking_lot::RwLock;
11pub use settings::{Settings, SettingsAware};
12use std::sync::{Arc, Weak};
13
14pub trait CreateProject: Sealed {
16 fn create_project(&self) -> ProjectResult<SharedProject>;
17}
18
19impl CreateProject for Arc<RwLock<Settings>> {
20 fn create_project(&self) -> ProjectResult<SharedProject> {
21 let root = self.with_settings(|s| {
22 let root = s.root_project();
23 create_root_project(self, root)
24 })?;
25 Ok(root)
26 }
27}
28
29fn create_project(
30 settings: &Arc<RwLock<Settings>>,
31 descriptor: &ProjectDescriptor,
32 parent: &SharedProject,
33) -> ProjectResult<()> {
34 let ref root = parent.with(|p| p.root_project());
35 parent.with_mut(|parent| {
36 parent.subproject_in(descriptor.name(), descriptor.directory(), |p| Ok(()))
37 })?;
38 let output = parent.with(|parent| parent.get_subproject(descriptor.name()).cloned())?;
39
40 settings.with_settings(|settings_ref| -> ProjectResult<()> {
41 for child in settings_ref.children_projects(descriptor) {
42 create_project(settings, child, &output)?;
43 }
44 Ok(())
45 })?;
46 Ok(())
47}
48
49fn create_root_project(
50 settings: &Arc<RwLock<Settings>>,
51 descriptor: &ProjectDescriptor,
52) -> ProjectResult<SharedProject> {
53 let mut output = Project::in_dir_with_id_and_root(
54 descriptor.directory(),
55 descriptor.name(),
56 None,
57 Some(Arc::downgrade(settings)),
58 )?;
59
60 settings.with_settings(|settings_ref| -> ProjectResult<()> {
61 for child in settings_ref.children_projects(descriptor) {
62 create_project(settings, child, &output)?;
63 }
64 Ok(())
65 })?;
66 Ok(output)
67}