use crate::{json_enum, json_struct};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
json_enum!(
#[derive(Default)]
#[serde(rename_all = "lowercase")]
pub enum HostLogTarget {
Stderr,
Stdout,
#[default]
Tracing,
}
);
json_enum!(
#[serde(untagged)]
pub enum HostLogInput {
Message(String),
TargetedMessage {
message: String,
target: HostLogTarget,
},
Fields {
data: HashMap<String, serde_json::Value>,
message: String,
},
}
);
impl From<&str> for HostLogInput {
fn from(message: &str) -> Self {
HostLogInput::Message(message.to_owned())
}
}
impl From<String> for HostLogInput {
fn from(message: String) -> Self {
HostLogInput::Message(message)
}
}
json_struct!(
pub struct ExecCommandInput {
pub args: Vec<String>,
pub command: String,
pub env_vars: HashMap<String, String>,
#[doc(hidden)]
pub set_executable: bool,
pub stream: bool,
}
);
impl ExecCommandInput {
pub fn pipe<C, I, V>(command: C, args: I) -> ExecCommandInput
where
C: AsRef<str>,
I: IntoIterator<Item = V>,
V: AsRef<str>,
{
ExecCommandInput {
command: command.as_ref().to_string(),
args: args.into_iter().map(|a| a.as_ref().to_owned()).collect(),
..ExecCommandInput::default()
}
}
pub fn inherit<C, I, V>(command: C, args: I) -> ExecCommandInput
where
C: AsRef<str>,
I: IntoIterator<Item = V>,
V: AsRef<str>,
{
let mut input = Self::pipe(command, args);
input.stream = true;
input
}
}
json_struct!(
pub struct ExecCommandOutput {
pub command: String,
pub exit_code: i32,
pub stderr: String,
pub stdout: String,
}
);