#![allow(dead_code)]
use clap::Parser;
use qn::cli::Cli;
use qn::errors::{exit_code_for, render_with_argv};
pub struct RunOutput {
pub stdout: String,
pub stderr: String,
pub exit_code: i32,
}
pub async fn run_qn(base_url: &str, extra_args: &[&str]) -> RunOutput {
run_qn_inner(base_url, extra_args, true).await
}
pub async fn run_qn_no_key(base_url: &str, extra_args: &[&str]) -> RunOutput {
run_qn_inner(base_url, extra_args, false).await
}
async fn run_qn_inner(base_url: &str, extra_args: &[&str], inject_key: bool) -> RunOutput {
let mut argv: Vec<String> = vec![
"qn".to_string(),
"--base-url".to_string(),
base_url.to_string(),
"--no-input".to_string(),
"--no-color".to_string(),
];
if inject_key {
argv.insert(1, "--api-key".to_string());
argv.insert(2, "test".to_string());
}
argv.extend(extra_args.iter().map(|s| s.to_string()));
let cli = match Cli::try_parse_from(&argv) {
Ok(c) => c,
Err(e) => {
let exit = if e.use_stderr() { 1 } else { 0 };
return RunOutput {
stdout: String::new(),
stderr: e.to_string(),
exit_code: exit,
};
}
};
let verbose = cli.verbose;
let argv_for_render: Vec<String> = argv.iter().skip(1).cloned().collect();
match cli.run().await {
Ok(()) => RunOutput {
stdout: String::new(),
stderr: String::new(),
exit_code: 0,
},
Err(e) => RunOutput {
stdout: String::new(),
stderr: render_with_argv(&e, verbose, &argv_for_render),
exit_code: exit_code_for(&e),
},
}
}
pub fn parse(extra_args: &[&str]) -> Result<Cli, clap::Error> {
let mut argv: Vec<String> = vec!["qn".to_string()];
argv.extend(extra_args.iter().map(|s| s.to_string()));
Cli::try_parse_from(&argv)
}