Skip to content

Commit 1214605

Browse files
committed
Using petgraph identifiers
1 parent 6b5443d commit 1214605

40 files changed

+394
-685
lines changed

packages/mach/src/cmd/build/build.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ pub fn build(
5252
env: mach_options.env,
5353
out_folder: mach_options.out_folder,
5454
},
55-
asset_contents: Default::default(),
5655
asset_graph: Default::default(),
5756
bundle_graph: Default::default(),
5857
plugins: Default::default(),
@@ -64,11 +63,17 @@ pub fn build(
6463

6564
// This will resolve imports, transform files and build the AssetGraph.
6665
resolve_and_transform(&mut c)?;
67-
emit_file(&c, "asset_graph.dot", c.debug_asset_graph_dot(DebugAssetGraphOptions{ show_specifiers: false }))?;
66+
emit_file(
67+
&c,
68+
"asset_graph.dot",
69+
c.debug_asset_graph_dot(DebugAssetGraphOptions {
70+
show_specifiers: false,
71+
})?,
72+
)?;
6873

6974
// This will read the asset graph and organize related assets into groupings (a.k.a bundles)
7075
bundle(&mut c)?;
71-
emit_file(&c, "bundle_graph.dot", c.debug_bundle_graph_dot())?;
76+
emit_file(&c, "bundle_graph.dot", c.debug_bundle_graph_dot()?)?;
7277

7378
// This will apply the runtime to and optimize the bundles
7479
package(&mut c)?;

packages/mach/src/core/bundling/bundle.rs

+27-28
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,56 @@ use petgraph::graph::NodeIndex;
22
use petgraph::visit::EdgeRef;
33
use petgraph::visit::NodeRef;
44

5+
use crate::types::AssetGraphExt;
56
use crate::types::AssetId;
67
use crate::types::Bundle;
8+
use crate::types::BundleGraphExt;
79
use crate::types::BundleId;
810
use crate::types::Compilation;
11+
use crate::types::ROOT_ASSET;
12+
use crate::types::ROOT_BUNDLE;
913

1014
// Simple bundling algorithm that does not deduplicate assets or bundle split
1115
pub fn bundle(c: &mut Compilation) -> anyhow::Result<()> {
12-
let asset_graph = c.asset_graph.as_graph();
13-
let root_node = c.asset_graph.root_node();
16+
c.bundle_graph.add_bundle(Bundle::default()); // Root bundle
1417

1518
let mut entries = Vec::<(AssetId, BundleId)>::new();
1619

17-
for entry_index in asset_graph.neighbors(root_node) {
18-
let bundle = c
19-
.bundle_graph
20-
.get_bundle(c.bundle_graph.root_node())
21-
.unwrap();
22-
let asset = c.asset_graph.get_with_nx(entry_index).unwrap();
23-
entries.push((asset.id.clone(), bundle.id.clone()));
20+
for entry_index in c.asset_graph.neighbors(ROOT_ASSET.clone()) {
21+
let bundle = c.bundle_graph.try_get_bundle(ROOT_BUNDLE.clone())?;
22+
23+
let asset = c.asset_graph.try_get_asset(entry_index)?;
24+
entries.push((asset.id.get()?.clone(), bundle.id.get()?.clone()));
2425
}
2526

2627
while let Some((entry_id, parent_bundle_id)) = entries.pop() {
27-
let parent_bundle_nx = c.bundle_graph.get_index(&parent_bundle_id).unwrap().clone();
28-
29-
let entry_asset_nx = c
30-
.asset_graph
31-
.get_nx(&entry_id)
32-
.unwrap()
33-
.clone();
34-
let entry_asset = c.asset_graph.get_with_nx(entry_asset_nx).unwrap();
28+
let parent_bundle_id = {
29+
let parent_bundle = c.bundle_graph.try_get_bundle(parent_bundle_id)?;
30+
parent_bundle.id.get()?.clone()
31+
};
32+
let entry_asset = c.asset_graph.get_asset(entry_id).unwrap();
3533

36-
let mut bundle = Bundle {
34+
let bundle = c.bundle_graph.add_bundle(Bundle {
3735
id: Default::default(),
3836
kind: entry_asset.kind.clone(),
39-
entry_asset: Some(entry_asset.id.clone()),
37+
entry_asset: Some(entry_asset.id.get()?.clone()),
4038
assets: Default::default(),
41-
};
39+
});
4240

43-
let mut dependencies = Vec::<NodeIndex>::from(vec![entry_asset_nx]);
41+
let mut dependencies = Vec::<NodeIndex>::from(vec![entry_asset.id.get()?.clone()]);
4442

4543
while let Some(current_nx) = dependencies.pop() {
46-
let current_asset = c.asset_graph.get_with_nx(current_nx).unwrap();
47-
bundle.insert_asset(&current_asset);
44+
let current_asset = c.asset_graph.get_asset(current_nx).unwrap();
45+
bundle.insert_asset(&current_asset)?;
4846

49-
let mut dependencies_edges = c.asset_graph.as_graph().edges(current_nx);
47+
let mut dependencies_edges = c.asset_graph.edges(current_nx);
5048
while let Some(edge) = dependencies_edges.next() {
5149
let dependency_nx = edge.target().id();
52-
let dependency_asset = c.asset_graph.get_with_nx(dependency_nx).unwrap();
50+
let dependency_asset = c.asset_graph.get_asset(dependency_nx).unwrap();
5351

5452
// Type change creates new bundle
5553
if bundle.kind != dependency_asset.kind {
56-
entries.push((dependency_asset.id.clone(), bundle.id.clone()));
54+
entries.push((dependency_asset.id.get()?.clone(), bundle.id.get()?.clone()));
5755
continue;
5856
}
5957

@@ -65,8 +63,9 @@ pub fn bundle(c: &mut Compilation) -> anyhow::Result<()> {
6563
}
6664

6765
if bundle.assets.len() != 0 {
68-
let nx = c.bundle_graph.add_bundle(bundle);
69-
c.bundle_graph.add_edge(&parent_bundle_nx, &nx)?;
66+
let current_bundle_id = bundle.id.get()?.clone();
67+
c.bundle_graph
68+
.add_edge(parent_bundle_id, current_bundle_id, ());
7069
}
7170
}
7271

packages/mach/src/core/config/constants.rs

-19
This file was deleted.

packages/mach/src/core/config/mod.rs

-3
This file was deleted.

packages/mach/src/core/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pub mod bundling;
2-
pub mod config;
32
pub mod emit;
43
pub mod packaging;
54
pub mod plugins;
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
mod resolve_and_transform;
22
mod run_resolvers;
33
mod run_transformers;
4-
#[cfg(test)]
5-
mod testing;
4+
// #[cfg(test)]
5+
// mod testing;
66

77
pub use self::resolve_and_transform::*;

packages/mach/src/core/resolve_and_transform/resolve_and_transform.rs

+31-30
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,26 @@ use std::collections::HashMap;
22
use std::path::PathBuf;
33

44
use super::run_resolvers::run_resolvers;
5-
use crate::core::config::ROOT_ASSET;
65
use crate::core::resolve_and_transform::run_transformers::run_transformers;
76
use crate::types::Asset;
7+
use crate::types::AssetGraphExt;
88
use crate::types::AssetId;
99
use crate::types::Compilation;
1010
use crate::types::Dependency;
11-
use crate::types::DependencyId;
1211
use crate::types::LinkingSymbol;
1312

1413
pub fn resolve_and_transform(c: &mut Compilation) -> anyhow::Result<()> {
1514
let mut queue = vec![];
15+
let root_asset = c.asset_graph.add_asset(Asset::default());
1616

17-
c.asset_graph.add_asset(ROOT_ASSET.clone());
18-
17+
// Add entries from config
1918
for entry in c.config.entries.iter() {
2019
queue.push(Dependency {
21-
id: DependencyId::new(),
20+
id: Default::default(),
2221
specifier: entry.to_str().unwrap().to_string(),
2322
source_asset_path: c.config.project_root.clone(),
2423
resolve_from: c.config.project_root.clone(),
25-
source_asset_id: ROOT_ASSET.id.clone(),
24+
source_asset_id: root_asset.id.get()?.clone(),
2625
specifier_type: Default::default(),
2726
priority: Default::default(),
2827
linking_symbol: LinkingSymbol::ImportDirect {
@@ -32,39 +31,49 @@ pub fn resolve_and_transform(c: &mut Compilation) -> anyhow::Result<()> {
3231
});
3332
}
3433

34+
// Avoid re-processing assets
3535
let mut completed_assets = HashMap::<PathBuf, AssetId>::new();
3636

3737
while let Some(dependency) = queue.pop() {
3838
let resolve_result = run_resolvers(&c, &dependency)?;
3939

4040
if let Some(asset_id) = completed_assets.get(&resolve_result.file_path) {
41+
// Asset exists
4142
c.asset_graph
42-
.add_dependency(&dependency.source_asset_id.clone(), &asset_id, dependency)?;
43+
.add_dependency(dependency.source_asset_id, asset_id.clone(), dependency);
4344
continue;
4445
};
4546

46-
let new_asset_id = AssetId::new();
47-
let mut new_asset = Asset {
48-
id: new_asset_id.clone(),
49-
file_path_absolute: resolve_result.file_path.clone(),
50-
file_path: resolve_result.file_path_relative.clone(),
51-
bundle_behavior: dependency.bundle_behavior.clone(),
52-
name: Default::default(),
53-
kind: Default::default(),
54-
content: Default::default(),
55-
linking_symbols: Default::default(),
47+
// New Asset
48+
let mut transformer_pipeline_result = run_transformers(&c, &resolve_result)?;
49+
50+
// Create new asset and add it to the
51+
let new_asset_id = {
52+
let asset = c.asset_graph.add_asset(Asset {
53+
id: Default::default(),
54+
name: transformer_pipeline_result.name,
55+
file_path_absolute: resolve_result.file_path.clone(),
56+
file_path: resolve_result.file_path_relative.clone(),
57+
kind: transformer_pipeline_result.kind,
58+
content: transformer_pipeline_result.content,
59+
bundle_behavior: transformer_pipeline_result.bundle_behavior,
60+
linking_symbols: transformer_pipeline_result.linking_symbols,
61+
});
62+
asset.id.get()?.clone()
5663
};
57-
completed_assets.insert(resolve_result.file_path.clone(), new_asset_id.clone());
5864

59-
let mut asset_dependencies = run_transformers(&c, &mut new_asset, &resolve_result)?;
65+
c.asset_graph
66+
.add_dependency(dependency.source_asset_id.clone(), new_asset_id, dependency);
6067

61-
while let Some(dependency_options) = asset_dependencies.pop() {
68+
completed_assets.insert(resolve_result.file_path.clone(), new_asset_id.clone());
69+
70+
while let Some(dependency_options) = transformer_pipeline_result.dependencies.pop() {
6271
let new_dependency = Dependency {
63-
id: DependencyId::new(),
72+
id: Default::default(),
6473
specifier: dependency_options.specifier.clone(),
6574
specifier_type: dependency_options.specifier_type,
6675
source_asset_path: resolve_result.file_path.clone(),
67-
source_asset_id: new_asset.id.clone(),
76+
source_asset_id: new_asset_id.clone(),
6877
resolve_from: resolve_result.file_path.clone(),
6978
priority: dependency_options.priority,
7079
linking_symbol: dependency_options.linking_symbol,
@@ -73,14 +82,6 @@ pub fn resolve_and_transform(c: &mut Compilation) -> anyhow::Result<()> {
7382

7483
queue.push(new_dependency);
7584
}
76-
77-
c.asset_graph.add_asset(new_asset);
78-
79-
c.asset_graph.add_dependency(
80-
&dependency.source_asset_id.clone(),
81-
&new_asset_id.clone(),
82-
dependency,
83-
)?;
8485
}
8586

8687
Ok(())

packages/mach/src/core/resolve_and_transform/run_transformers.rs

+28-21
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
use std::fs;
22

33
use super::run_resolvers::RunResolversResult;
4-
use crate::types::Asset;
54
use crate::types::BundleBehavior;
65
use crate::types::Compilation;
76
use crate::types::DependencyOptions;
87
use crate::types::LinkingSymbol;
98
use crate::types::MutableAsset;
109

10+
pub struct TransformerPipelineResult {
11+
pub name: String,
12+
pub kind: String,
13+
pub content: Vec<u8>,
14+
pub linking_symbols: Vec<LinkingSymbol>,
15+
pub bundle_behavior: BundleBehavior,
16+
pub dependencies: Vec<DependencyOptions>,
17+
}
18+
1119
pub fn run_transformers(
1220
c: &Compilation,
13-
asset: &mut Asset,
1421
resolve_result: &RunResolversResult,
15-
) -> anyhow::Result<Vec<DependencyOptions>> {
22+
) -> anyhow::Result<TransformerPipelineResult> {
1623
let mut file_path = resolve_result.file_path.clone();
1724

1825
let Ok(mut content) = fs::read(&resolve_result.file_path) else {
@@ -67,22 +74,22 @@ pub fn run_transformers(
6774
i += 1;
6875
}
6976

70-
// Update existing Asset with new data
71-
asset.name = file_path
72-
.file_stem()
73-
.unwrap_or_default()
74-
.to_str()
75-
.unwrap_or_default()
76-
.to_string();
77-
asset.content = content;
78-
asset.kind = file_path
79-
.extension()
80-
.unwrap_or_default()
81-
.to_str()
82-
.unwrap_or_default()
83-
.to_string();
84-
asset.linking_symbols = linking_symbols;
85-
asset.bundle_behavior = bundle_behavior;
86-
87-
Ok(asset_dependencies)
77+
Ok(TransformerPipelineResult {
78+
name: file_path
79+
.file_stem()
80+
.unwrap_or_default()
81+
.to_str()
82+
.unwrap_or_default()
83+
.to_string(),
84+
kind: file_path
85+
.extension()
86+
.unwrap_or_default()
87+
.to_str()
88+
.unwrap_or_default()
89+
.to_string(),
90+
content,
91+
linking_symbols,
92+
bundle_behavior,
93+
dependencies: asset_dependencies,
94+
})
8895
}

packages/mach/src/types/asset.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
use std::fmt::Debug;
22
use std::path::PathBuf;
33

4-
use super::AssetId;
4+
use petgraph::graph::NodeIndex;
5+
56
use super::BundleBehavior;
7+
use super::Identifier;
68
use super::LinkingSymbol;
79
use crate::kit::hash::hash_sha_256;
810

11+
pub type AssetId = NodeIndex;
12+
913
#[derive(Clone, Default)]
1014
pub struct Asset {
11-
/// Internal identifier
12-
pub id: AssetId,
15+
/// Identifier, assigned when the asset is added to the asset graph
16+
pub id: Identifier<AssetId>,
1317
/// The file name without the extension
1418
pub name: String,
1519
/// Absolute filepath to the asset
@@ -28,7 +32,6 @@ pub struct Asset {
2832

2933
impl Asset {
3034
pub fn content_hash(&self) -> String {
31-
// Todo, cache this
3235
return hash_sha_256(&self.content);
3336
}
3437
}
@@ -39,7 +42,7 @@ impl Debug for Asset {
3942
f: &mut std::fmt::Formatter<'_>,
4043
) -> std::fmt::Result {
4144
f.debug_struct("Asset")
42-
.field("id", &self.id.0)
45+
.field("id", &self.id)
4346
.field("file_path", &self.file_path_absolute)
4447
.field("file_path_rel", &self.file_path)
4548
.field("bundle_behavior", &self.bundle_behavior)

packages/mach/src/types/asset_contents.rs

-5
This file was deleted.

0 commit comments

Comments
 (0)