assemble_core/startup/
initialization.rs

1//! Handles managing and monitoring build initialization
2mod 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
14/// Trait for creating a project
15pub 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}