Skip to content

Commit 0f100d7

Browse files
committed
Update IDs.
1 parent 66d598e commit 0f100d7

11 files changed

Lines changed: 132 additions & 40 deletions

File tree

crates/action-graph/src/action_graph_builder.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ impl<'query> ActionGraphBuilder<'query> {
167167
toolchain_id: &Id,
168168
allow_override: bool,
169169
) -> Option<ToolchainSpec> {
170-
if let Some(config) = project.config.toolchain.plugins.get(toolchain_id) {
170+
if let Some(config) = project.config.toolchain.get_plugin_config(toolchain_id) {
171171
if !config.is_enabled() {
172172
return None;
173173
}
@@ -182,7 +182,11 @@ impl<'query> ActionGraphBuilder<'query> {
182182
}
183183
}
184184

185-
if let Some(config) = self.app_context.toolchain_config.plugins.get(toolchain_id) {
185+
if let Some(config) = self
186+
.app_context
187+
.toolchain_config
188+
.get_plugin_config(toolchain_id)
189+
{
186190
return Some(match &config.version {
187191
Some(version) => ToolchainSpec::new(toolchain_id.to_owned(), version.to_owned()),
188192
None => ToolchainSpec::new_global(toolchain_id.to_owned()),

crates/app/src/commands/teardown.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ pub async fn teardown(session: MoonSession) -> AppResult {
2424
.teardown_toolchain_all(|registry, toolchain| TeardownToolchainInput {
2525
configured_version: session
2626
.toolchain_config
27-
.plugins
28-
.get(toolchain.id.as_str())
27+
.get_plugin_config(toolchain.id.as_str())
2928
.and_then(|plugin| plugin.version.clone()),
3029
context: registry.create_context(),
3130
toolchain_config: registry.create_config(&toolchain.id, &session.toolchain_config),

crates/common/src/id.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,32 @@ impl Id {
5454
Id(CompactString::new(id))
5555
}
5656

57+
pub fn stable<S: AsRef<str>>(id: S) -> Id {
58+
let id = id.as_ref();
59+
60+
if let Some(suffix) = id.strip_prefix("unstable_") {
61+
Id::raw(suffix)
62+
} else {
63+
Id::raw(id)
64+
}
65+
}
66+
67+
pub fn unstable<S: AsRef<str>>(id: S) -> Id {
68+
let id = id.as_ref();
69+
70+
if id.starts_with("unstable_") {
71+
Id::raw(id)
72+
} else {
73+
Id::raw(format!("unstable_{id}"))
74+
}
75+
}
76+
77+
pub fn stable_and_unstable<S: AsRef<str>>(id: S) -> (Id, Id) {
78+
let id = id.as_ref();
79+
80+
(Id::stable(id), Id::unstable(id))
81+
}
82+
5783
pub fn as_str(&self) -> &str {
5884
&self.0
5985
}

crates/config/src/project/overrides_config.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ config_struct!(
7878
}
7979
);
8080

81+
impl ProjectToolchainConfig {
82+
pub fn get_plugin_config(&self, id: impl AsRef<str>) -> Option<&ProjectToolchainEntry> {
83+
let (stable_id, unstable_id) = Id::stable_and_unstable(id);
84+
85+
self.plugins
86+
.get(&stable_id)
87+
.or_else(|| self.plugins.get(&unstable_id))
88+
}
89+
}
90+
8191
config_struct!(
8292
/// Controls how tasks are inherited.
8393
#[derive(Config)]

crates/config/src/toolchain_config.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ impl ToolchainConfig {
119119
tools
120120
}
121121

122+
pub fn get_plugin_config(&self, id: impl AsRef<str>) -> Option<&ToolchainPluginConfig> {
123+
let (stable_id, unstable_id) = Id::stable_and_unstable(id);
124+
125+
self.plugins
126+
.get(&stable_id)
127+
.or_else(|| self.plugins.get(&unstable_id))
128+
}
129+
122130
#[cfg(feature = "proto")]
123131
pub fn get_plugin_locator(id: &Id) -> Option<proto_core::PluginLocator> {
124132
use proto_core::warpgate::{PluginLocator, UrlLocator};

crates/pdk/src/funcs.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ extern "ExtismHost" {
1212
fn load_projects_by_id(ids: Json<Vec<String>>) -> Json<FxHashMap<Id, Project>>;
1313
fn load_task_by_target(target: String) -> Json<Task>;
1414
fn load_tasks_by_target(targets: Json<Vec<String>>) -> Json<FxHashMap<Target, Task>>;
15-
fn load_toolchain_config_by_id<T: DeserializeOwned>(id: String) -> Json<T>;
15+
fn load_toolchain_config_by_id<T: DeserializeOwned>(
16+
toolchain_id: String,
17+
project_id: Option<String>,
18+
) -> Json<T>;
1619
}
1720

1821
/// Load a single project by ID.
@@ -65,8 +68,23 @@ where
6568
}
6669

6770
/// Load configuration for a toolchain by ID.
68-
pub fn load_toolchain_config<T: DeserializeOwned>(id: impl AsRef<str>) -> AnyResult<T> {
69-
let config = unsafe { load_toolchain_config_by_id(id.as_ref().into())? };
71+
pub fn load_toolchain_config<T: DeserializeOwned>(toolchain_id: impl AsRef<str>) -> AnyResult<T> {
72+
let config = unsafe { load_toolchain_config_by_id(toolchain_id.as_ref().into(), None)? };
73+
74+
Ok(config.0)
75+
}
76+
77+
/// Load project-specific configuration for a toolchain by ID.
78+
pub fn load_project_toolchain_config<T: DeserializeOwned>(
79+
project_id: impl AsRef<str>,
80+
toolchain_id: impl AsRef<str>,
81+
) -> AnyResult<T> {
82+
let config = unsafe {
83+
load_toolchain_config_by_id(
84+
toolchain_id.as_ref().into(),
85+
Some(project_id.as_ref().into()),
86+
)?
87+
};
7088

7189
Ok(config.0)
7290
}

crates/plugin/src/host.rs

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use extism::{CurrentPlugin, Error, Function, UserData, Val, ValType};
22
use moon_common::{Id, color};
3-
use moon_config::{ToolchainConfig, WorkspaceConfig};
3+
use moon_config::{ProjectToolchainEntry, ToolchainConfig, ToolchainPluginConfig, WorkspaceConfig};
44
use moon_env::MoonEnvironment;
55
use moon_target::Target;
66
use moon_workspace_graph::WorkspaceGraph;
@@ -260,40 +260,64 @@ fn load_toolchain_config_by_id(
260260
outputs: &mut [Val],
261261
user_data: UserData<MoonHostData>,
262262
) -> Result<(), Error> {
263-
let id_raw: String = plugin.memory_get_val(&inputs[0])?;
264-
let id = Id::new(id_raw)?;
265-
let unstable_id = Id::new(format!("unstable_{id}"))?;
266263
let uuid = plugin.id().to_string();
264+
let toolchain_id = Id::new(plugin.memory_get_val::<String>(&inputs[0])?)?;
265+
let mut project_id = None;
266+
267+
if let Some(input) = inputs.get(1) {
268+
project_id.replace(Id::new(plugin.memory_get_val::<String>(input)?)?);
269+
}
267270

268271
trace!(
269272
plugin = &uuid,
270-
toolchain_id = id.as_str(),
273+
project_id = project_id.as_ref().map(|id| id.as_str()),
274+
toolchain_id = toolchain_id.as_str(),
271275
"Calling host function {}",
272276
color::label("load_toolchain_config_by_id"),
273277
);
274278

275279
let data = user_data.get()?;
276280
let data = data.lock().unwrap();
277281

278-
let config = data
279-
.toolchain_config
280-
.plugins
281-
.get(&id)
282-
.or_else(|| data.toolchain_config.plugins.get(&unstable_id))
283-
.ok_or_else(|| {
284-
Error::msg(format!(
285-
"Unable to load toolchain configuration. Toolchain {id} does not exist."
286-
))
287-
})?;
282+
match &project_id {
283+
Some(project_id) => {
284+
let workspace_graph = data.workspace_graph.get().unwrap();
285+
let project = workspace_graph.get_project(project_id).map_err(map_error)?;
286+
287+
let default_config = ToolchainPluginConfig::default();
288+
let config = project
289+
.config
290+
.toolchain
291+
.get_plugin_config(&toolchain_id)
292+
.and_then(|entry| match entry {
293+
ProjectToolchainEntry::Config(cfg) => Some(cfg),
294+
_ => None,
295+
})
296+
.unwrap_or(&default_config);
297+
298+
plugin.memory_set_val(&mut outputs[0], serde_json::to_string(&config.to_json())?)?;
299+
}
300+
None => {
301+
let config = data
302+
.toolchain_config
303+
.get_plugin_config(&toolchain_id)
304+
.ok_or_else(|| {
305+
Error::msg(format!(
306+
"Unable to load toolchain configuration. Toolchain {toolchain_id} does not exist."
307+
))
308+
})?;
309+
310+
plugin.memory_set_val(&mut outputs[0], serde_json::to_string(&config.to_json())?)?;
311+
}
312+
};
288313

289314
trace!(
290315
plugin = &uuid,
291-
toolchain_id = id.as_str(),
316+
project_id = project_id.as_ref().map(|id| id.as_str()),
317+
toolchain_id = toolchain_id.as_str(),
292318
"Called host function {}",
293319
color::label("load_toolchain_config_by_id"),
294320
);
295321

296-
plugin.memory_set_val(&mut outputs[0], serde_json::to_string(&config.to_json())?)?;
297-
298322
Ok(())
299323
}

crates/project/src/project.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ impl Project {
8585
pub fn get_enabled_toolchains(&self) -> Vec<&Id> {
8686
self.toolchains
8787
.iter()
88-
.filter(|id| match self.config.toolchain.plugins.get(*id) {
88+
.filter(|id| match self.config.toolchain.get_plugin_config(*id) {
8989
None => true,
9090
Some(cfg) => cfg.is_enabled(),
9191
})
@@ -97,7 +97,7 @@ impl Project {
9797
pub fn get_enabled_toolchains_for_task<'task>(&self, task: &'task Task) -> Vec<&'task Id> {
9898
task.toolchains
9999
.iter()
100-
.filter(|id| match self.config.toolchain.plugins.get(*id) {
100+
.filter(|id| match self.config.toolchain.get_plugin_config(*id) {
101101
None => true,
102102
Some(cfg) => cfg.is_enabled(),
103103
})

crates/task-runner/src/task_hashing.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,7 @@ async fn apply_toolchain(
155155
// Has a version override
156156
if let Some(version) = project_config
157157
.toolchain
158-
.plugins
159-
.get(toolchain.id.as_str())
158+
.get_plugin_config(toolchain.id.as_str())
160159
.and_then(|config| config.get_version())
161160
{
162161
content.version = Some(version.to_owned());
@@ -165,8 +164,7 @@ async fn apply_toolchain(
165164
// Or an inherited version
166165
else if let Some(version) = app_context
167166
.toolchain_config
168-
.plugins
169-
.get(toolchain.id.as_str())
167+
.get_plugin_config(toolchain.id.as_str())
170168
.and_then(|config| config.version.as_ref())
171169
{
172170
content.version = Some(version.to_owned());

crates/toolchain-plugin/src/toolchain_registry.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl ToolchainRegistry {
5353
}
5454

5555
pub fn create_config(&self, id: &str, toolchain_config: &ToolchainConfig) -> JsonValue {
56-
if let Some(config) = toolchain_config.plugins.get(id) {
56+
if let Some(config) = toolchain_config.get_plugin_config(id) {
5757
return config.to_json();
5858
}
5959

@@ -69,7 +69,7 @@ impl ToolchainRegistry {
6969
let mut data = self.create_config(id, toolchain_config);
7070

7171
if let Some(ProjectToolchainEntry::Config(leaf_config)) =
72-
project_config.toolchain.plugins.get(id)
72+
project_config.toolchain.get_plugin_config(id)
7373
{
7474
let next = leaf_config.to_json();
7575

0 commit comments

Comments
 (0)