|
1 | 1 | use extism::{CurrentPlugin, Error, Function, UserData, Val, ValType}; |
2 | 2 | use moon_common::{Id, color}; |
3 | | -use moon_config::{ToolchainConfig, WorkspaceConfig}; |
| 3 | +use moon_config::{ProjectToolchainEntry, ToolchainConfig, ToolchainPluginConfig, WorkspaceConfig}; |
4 | 4 | use moon_env::MoonEnvironment; |
5 | 5 | use moon_target::Target; |
6 | 6 | use moon_workspace_graph::WorkspaceGraph; |
@@ -260,40 +260,64 @@ fn load_toolchain_config_by_id( |
260 | 260 | outputs: &mut [Val], |
261 | 261 | user_data: UserData<MoonHostData>, |
262 | 262 | ) -> 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}"))?; |
266 | 263 | 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 | + } |
267 | 270 |
|
268 | 271 | trace!( |
269 | 272 | 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(), |
271 | 275 | "Calling host function {}", |
272 | 276 | color::label("load_toolchain_config_by_id"), |
273 | 277 | ); |
274 | 278 |
|
275 | 279 | let data = user_data.get()?; |
276 | 280 | let data = data.lock().unwrap(); |
277 | 281 |
|
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 | + }; |
288 | 313 |
|
289 | 314 | trace!( |
290 | 315 | 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(), |
292 | 318 | "Called host function {}", |
293 | 319 | color::label("load_toolchain_config_by_id"), |
294 | 320 | ); |
295 | 321 |
|
296 | | - plugin.memory_set_val(&mut outputs[0], serde_json::to_string(&config.to_json())?)?; |
297 | | - |
298 | 322 | Ok(()) |
299 | 323 | } |
0 commit comments