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}