use std::io::{self, Read};
use std::path::PathBuf;
use std::process;
use clap::Args;
use rsigma_parser::{parse_sigma_file, parse_sigma_yaml};
#[derive(Args, Debug)]
pub(crate) struct ParseArgs {
pub path: PathBuf,
#[arg(short, long, default_value_t = true)]
pub pretty: bool,
}
#[derive(Args, Debug)]
pub(crate) struct ConditionArgs {
pub expr: String,
}
#[derive(Args, Debug)]
pub(crate) struct StdinArgs {
#[arg(short, long, default_value_t = true)]
pub pretty: bool,
}
pub(crate) fn cmd_parse(args: ParseArgs) {
let ParseArgs { path, pretty } = args;
match parse_sigma_file(&path) {
Ok(collection) => {
crate::print_warnings(&collection.errors);
crate::print_json(&collection, pretty);
}
Err(e) => {
eprintln!("Error parsing {}: {e}", path.display());
process::exit(crate::exit_code::RULE_ERROR);
}
}
}
pub(crate) fn cmd_condition(args: ConditionArgs) {
let ConditionArgs { expr } = args;
match rsigma_parser::parse_condition(&expr) {
Ok(ast) => crate::print_json(&ast, true),
Err(e) => {
eprintln!("Condition parse error: {e}");
process::exit(crate::exit_code::RULE_ERROR);
}
}
}
pub(crate) fn cmd_stdin(args: StdinArgs) {
let StdinArgs { pretty } = args;
let mut input = String::new();
if let Err(e) = io::stdin().read_to_string(&mut input) {
eprintln!("Error reading stdin: {e}");
process::exit(crate::exit_code::RULE_ERROR);
}
match parse_sigma_yaml(&input) {
Ok(collection) => {
crate::print_warnings(&collection.errors);
crate::print_json(&collection, pretty);
}
Err(e) => {
eprintln!("Parse error: {e}");
process::exit(crate::exit_code::RULE_ERROR);
}
}
}