use crate::compiler::Function;
use clap::Parser;
use std::io;
use std::path::PathBuf;
use super::{build_functions_doc, document_functions_to_dir};
#[derive(Parser, Debug)]
#[command(name = "VRL", about)]
pub struct Opts {
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(short, long, default_value_t = false)]
minify: bool,
#[arg(short, long, default_value = "json")]
extension: String,
}
#[must_use]
pub fn docs(opts: &Opts, functions: &[Box<dyn Function>]) -> exitcode::ExitCode {
match run(opts, functions) {
Ok(()) => exitcode::OK,
Err(err) => {
#[allow(clippy::print_stderr)]
{
eprintln!("{err}");
}
exitcode::SOFTWARE
}
}
}
fn run(opts: &Opts, functions: &[Box<dyn Function>]) -> Result<(), io::Error> {
if let Some(output) = &opts.output {
document_functions_to_dir(functions, output, &opts.extension)
} else {
let built = build_functions_doc(functions);
#[allow(clippy::print_stdout)]
if opts.minify {
println!(
"{}",
serde_json::to_string(&built).expect("FunctionDoc serialization should not fail")
);
} else {
println!(
"{}",
serde_json::to_string_pretty(&built)
.expect("FunctionDoc serialization should not fail")
);
}
Ok(())
}
}