use crate::common::{error::Error, log::Loglevel, util::friendly_enum_parse};
use named_type::NamedType;
use named_type_derive::*;
use serde::{Deserialize, Serialize};
use std::process::Stdio;
use strum_macros::{Display, EnumIter, EnumString};
#[derive(Display, EnumIter, EnumString, NamedType, Debug, Copy, Clone, PartialEq)]
enum StreamCaptureOption {
Pass,
Null,
Fatal,
Error,
Warn,
Note,
Info,
Debug,
Trace,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub enum StreamCaptureMode {
Pass,
Null,
Capture(Loglevel),
}
impl ::std::str::FromStr for StreamCaptureMode {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let opt: StreamCaptureOption = friendly_enum_parse(s)?;
Ok(match opt {
StreamCaptureOption::Pass => StreamCaptureMode::Pass,
StreamCaptureOption::Null => StreamCaptureMode::Null,
StreamCaptureOption::Fatal => StreamCaptureMode::Capture(Loglevel::Fatal),
StreamCaptureOption::Error => StreamCaptureMode::Capture(Loglevel::Error),
StreamCaptureOption::Warn => StreamCaptureMode::Capture(Loglevel::Warn),
StreamCaptureOption::Note => StreamCaptureMode::Capture(Loglevel::Note),
StreamCaptureOption::Info => StreamCaptureMode::Capture(Loglevel::Info),
StreamCaptureOption::Debug => StreamCaptureMode::Capture(Loglevel::Debug),
StreamCaptureOption::Trace => StreamCaptureMode::Capture(Loglevel::Trace),
})
}
}
impl Into<Stdio> for StreamCaptureMode {
fn into(self) -> Stdio {
match self {
StreamCaptureMode::Null => Stdio::null(),
StreamCaptureMode::Pass => Stdio::inherit(),
StreamCaptureMode::Capture(_) => Stdio::piped(),
}
}
}
impl Into<Stdio> for &StreamCaptureMode {
fn into(self) -> Stdio {
match *self {
StreamCaptureMode::Null => Stdio::null(),
StreamCaptureMode::Pass => Stdio::inherit(),
StreamCaptureMode::Capture(_) => Stdio::piped(),
}
}
}