dfx_core/extension/manager/
execute.rs1use super::ExtensionManager;
2use crate::config::cache::get_bin_cache;
3use crate::error::extension::RunExtensionError;
4use std::ffi::OsString;
5use std::path::PathBuf;
6
7impl ExtensionManager {
8 pub fn run_extension(
9 &self,
10 extension_name: OsString,
11 mut params: Vec<OsString>,
12 project_root: Option<PathBuf>,
13 ) -> Result<(), RunExtensionError> {
14 let extension_name = extension_name
15 .into_string()
16 .map_err(RunExtensionError::InvalidExtensionName)?;
17
18 let mut extension_binary = self.get_extension_binary(&extension_name)?;
19 if let Some(project_root) = project_root {
20 extension_binary.current_dir(project_root);
21 }
22 let dfx_cache = get_bin_cache(self.dfx_version.to_string().as_str())?;
23
24 params.extend(["--dfx-cache-path".into(), dfx_cache.into_os_string()]);
25
26 let mut child = extension_binary
27 .args(¶ms)
28 .spawn()
29 .map_err(|e| RunExtensionError::FailedToLaunchExtension(extension_name.clone(), e))?;
30
31 let exit_status = child.wait().map_err(|e| {
32 RunExtensionError::ExtensionNeverFinishedExecuting(extension_name.clone(), e)
33 })?;
34
35 let code = exit_status
36 .code()
37 .ok_or(RunExtensionError::ExtensionExecutionTerminatedViaSignal)?;
38
39 if code != 0 {
40 Err(RunExtensionError::ExtensionExitedWithNonZeroStatus(code))
41 } else {
42 Ok(())
43 }
44 }
45}