use std::borrow::Cow;
use std::ffi::CString;
use crate::error::Error;
use crate::format::OutputFormat;
use crate::log_level::LogLevel;
#[derive(Debug)]
pub enum Arg<'a> {
ConfigFilePath(Cow<'a, str>),
LogLevel(LogLevel),
OutputFormat(OutputFormat),
MultiQuery,
Custom(Cow<'a, str>, Option<Cow<'a, str>>),
}
impl<'a> Arg<'a> {
#[allow(dead_code)]
pub(crate) fn to_cstring(&self) -> Result<CString, Error> {
Ok(match self {
Self::ConfigFilePath(v) => CString::new(format!("--config-file={v}")),
Self::LogLevel(v) => CString::new(format!("--log-level={}", v.as_str())),
Self::OutputFormat(v) => CString::new(format!("--output-format={}", v.as_str())),
Self::MultiQuery => CString::new("-n"),
Self::Custom(k, v) => match v {
None => CString::new(k.as_ref()),
Some(v) => CString::new(format!("--{k}={v}")),
},
}?)
}
pub(crate) fn as_output_format(&self) -> Option<OutputFormat> {
match self {
Self::OutputFormat(f) => Some(*f),
_ => None,
}
}
}
pub(crate) fn extract_output_format(args: Option<&[Arg]>) -> OutputFormat {
args.and_then(|args| args.iter().find_map(|a| a.as_output_format()))
.unwrap_or(OutputFormat::TabSeparated)
}