use std::path::Path;
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
eprintln!(
"[x1zz-exec] 사용법: x1zz-exec <file.xzz|file.csv> [--verbose] [--output <path.csv>]"
);
std::process::exit(1);
}
let input_path = &args[1];
let verbose = args.iter().any(|a| a == "--verbose" || a == "-v");
let output_csv: Option<String> = args
.windows(2)
.find(|w| w[0] == "--output" || w[0] == "-o")
.map(|w| w[1].clone());
if input_path.to_lowercase().ends_with(".csv") {
run_csv_benchmark(input_path, verbose);
return;
}
if let Err(e) = x1zz_exec::run_pipeline(input_path, verbose, output_csv.as_deref()) {
eprintln!("{}", e);
std::process::exit(1);
}
}
fn run_csv_benchmark(csv_path: &str, verbose: bool) {
let posix_path = csv_path.replace('\\', "/");
let xzz_source = format!(
r#"// x1zzLang Benchmark Pipeline — auto-generated from CSV input
type AirQuality = {{
date: string,
station: string,
pm10: Option<float>,
pm25: Option<float>,
}};
v raw = load("{posix_path}") :: AirQuality
|> select([date, station, pm10, pm25]);
v cleaned = raw
|> dropNull("pm10")
|> filter(col("pm10") < 120)
|> filter(col("pm25") > 10);
v by_station = cleaned
|> groupBy("station")
|> sum("pm10");
v top10_mean = cleaned
|> groupBy("station")
|> mean("pm10")
|> orderBy("pm10", desc: true)
|> take(10);
v filled = raw
|> fillNull("pm25", 0)
|> filter(col("pm10") > 50)
|> groupBy("station")
|> count("pm25")
|> orderBy("pm25", desc: true)
|> take(5);
"#,
posix_path = posix_path
);
let tmp_xzz_path = if let Some(parent) = Path::new(csv_path).parent() {
let stem = Path::new(csv_path)
.file_stem()
.and_then(|s| s.to_str())
.unwrap_or("benchmark");
parent
.join(format!("_{}_bench.xzz", stem))
.to_string_lossy()
.to_string()
} else {
format!("_{}_bench.xzz", csv_path)
};
if let Err(e) = std::fs::write(&tmp_xzz_path, &xzz_source) {
eprintln!(
"[x1zz-exec] ERROR: 임시 .xzz 파일 생성 실패: {} — {}",
tmp_xzz_path, e
);
std::process::exit(1);
}
let result = x1zz_exec::run_pipeline(&tmp_xzz_path, verbose, None);
let _ = std::fs::remove_file(&tmp_xzz_path);
if let Err(e) = result {
eprintln!("{}", e);
std::process::exit(1);
}
}