2022-10-26 22:13:42 +00:00
|
|
|
pub mod action;
|
2022-10-28 21:15:33 +00:00
|
|
|
pub mod channel_value;
|
2022-10-25 18:57:09 +00:00
|
|
|
pub mod cli;
|
2022-09-15 19:11:46 +00:00
|
|
|
mod error;
|
2022-10-25 18:57:09 +00:00
|
|
|
mod interaction;
|
2022-10-19 22:12:50 +00:00
|
|
|
mod os;
|
2022-09-14 22:18:13 +00:00
|
|
|
mod plan;
|
2022-10-26 22:13:42 +00:00
|
|
|
pub mod planner;
|
2022-09-14 22:18:13 +00:00
|
|
|
mod settings;
|
|
|
|
|
2022-10-26 22:13:42 +00:00
|
|
|
use std::{ffi::OsStr, process::Output};
|
2022-09-06 19:48:37 +00:00
|
|
|
|
2022-10-28 21:15:33 +00:00
|
|
|
pub use action::Action;
|
|
|
|
pub use planner::Planner;
|
|
|
|
|
2022-09-06 19:48:37 +00:00
|
|
|
pub use error::HarmonicError;
|
2022-09-15 17:29:22 +00:00
|
|
|
pub use plan::InstallPlan;
|
2022-10-26 22:13:42 +00:00
|
|
|
use planner::BuiltinPlanner;
|
|
|
|
|
2022-10-26 16:27:50 +00:00
|
|
|
pub use settings::CommonSettings;
|
2022-09-06 19:48:37 +00:00
|
|
|
|
2022-09-26 21:07:53 +00:00
|
|
|
use tokio::process::Command;
|
2022-09-06 19:48:37 +00:00
|
|
|
|
2022-09-09 18:43:35 +00:00
|
|
|
#[tracing::instrument(skip_all, fields(command = %format!("{:?}", command.as_std())))]
|
2022-10-18 18:03:19 +00:00
|
|
|
async fn execute_command(command: &mut Command) -> Result<Output, std::io::Error> {
|
2022-09-23 19:26:59 +00:00
|
|
|
tracing::trace!("Executing");
|
|
|
|
let command_str = format!("{:?}", command.as_std());
|
2022-10-18 18:03:19 +00:00
|
|
|
let output = command.output().await?;
|
|
|
|
match output.status.success() {
|
|
|
|
true => Ok(output),
|
2022-09-26 21:07:53 +00:00
|
|
|
false => Err(std::io::Error::new(
|
|
|
|
std::io::ErrorKind::Other,
|
2022-10-24 23:16:18 +00:00
|
|
|
format!(
|
|
|
|
"Command `{command_str}` failed status, stderr:\n{}\n",
|
|
|
|
String::from_utf8(output.stderr).unwrap_or_else(|_e| String::from("<Non-UTF-8>"))
|
|
|
|
),
|
2022-09-26 21:07:53 +00:00
|
|
|
)),
|
2022-09-09 18:43:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tracing::instrument(skip_all, fields(
|
|
|
|
k = %k.as_ref().to_string_lossy(),
|
|
|
|
v = %v.as_ref().to_string_lossy(),
|
|
|
|
))]
|
2022-09-26 15:43:10 +00:00
|
|
|
fn set_env(k: impl AsRef<OsStr>, v: impl AsRef<OsStr>) {
|
|
|
|
tracing::trace!("Setting env");
|
|
|
|
std::env::set_var(k.as_ref(), v.as_ref());
|
2022-09-08 00:13:06 +00:00
|
|
|
}
|
2022-10-27 15:38:21 +00:00
|
|
|
|
2022-10-28 21:15:33 +00:00
|
|
|
trait BoxableError: std::error::Error + Send + Sync {
|
2022-10-27 15:38:21 +00:00
|
|
|
fn boxed(self) -> Box<dyn std::error::Error + Send + Sync>
|
|
|
|
where
|
|
|
|
Self: Sized + 'static,
|
|
|
|
{
|
|
|
|
Box::new(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<E> BoxableError for E where E: std::error::Error + Send + Sized + Sync {}
|