Skip to main content

dfx_core/extension/manager/
execute.rs

1use 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(&params)
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}