fluentci_ext/
envhub.rs

1use std::{
2    process::{Command, ExitStatus, Stdio},
3    sync::mpsc::Sender,
4};
5
6use crate::{exec, nix::Nix, pkgx::Pkgx, Extension};
7use anyhow::Error;
8use fluentci_types::Output;
9
10#[derive(Default)]
11pub struct Envhub {}
12
13impl Envhub {
14    pub fn r#use(&self, environment: &str, work_dir: &str) -> Result<ExitStatus, Error> {
15        let mut child = Command::new("bash")
16            .arg("-c")
17            .arg(format!("envhub use {}", environment))
18            .current_dir(work_dir)
19            .stdout(Stdio::inherit())
20            .stderr(Stdio::inherit())
21            .spawn()?;
22        child.wait().map_err(Error::from)
23    }
24}
25
26impl Extension for Envhub {
27    fn exec(
28        &mut self,
29        cmd: &str,
30        tx: Sender<String>,
31        out: Output,
32        last_cmd: bool,
33        work_dir: &str,
34    ) -> Result<ExitStatus, Error> {
35        self.setup()?;
36
37        if cmd.is_empty() {
38            return Ok(ExitStatus::default());
39        }
40
41        exec(cmd, tx, out, last_cmd, work_dir)
42    }
43
44    fn setup(&self) -> Result<(), Error> {
45        Nix::default().setup()?;
46        Pkgx::default().install(vec!["curl", "git"])?;
47        let mut child = Command::new("sh")
48            .arg("-c")
49            .arg("type envhub > /dev/null || curl -sSL https://install.envhub.sh | bash")
50            .stdin(Stdio::inherit())
51            .stdout(Stdio::inherit())
52            .stderr(Stdio::inherit())
53            .spawn()?;
54        child.wait().map_err(Error::from)?;
55        Ok(())
56    }
57}