use process_mining::core::event_data::object_centric::ocel_csv::export_ocel_csv_to_path;
use process_mining::{Importable, OCEL};
use std::env;
use std::error::Error;
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn Error>> {
let args: Vec<String> = env::args().collect();
if args.len() < 2 || args.len() > 3 {
eprintln!("Usage: {} <input_ocel_file> [output.ocel.csv]", args[0]);
eprintln!();
eprintln!("Imports an OCEL file (XML/JSON) and exports it to CSV format.");
eprintln!();
eprintln!("Arguments:");
eprintln!(" input_ocel_file Path to input OCEL file (.xml, .json, .jsonocel)");
eprintln!(" output.ocel.csv Optional output path (default: input name + .ocel.csv)");
std::process::exit(1);
}
let input_path = PathBuf::from(&args[1]);
let output_path = if args.len() == 3 {
PathBuf::from(&args[2])
} else {
let stem = input_path
.file_stem()
.and_then(|s| s.to_str())
.unwrap_or("output");
input_path.with_file_name(format!("{}.ocel.csv", stem))
};
println!("Importing OCEL from {:?}", input_path);
let ocel = OCEL::import_from_path(&input_path)?;
println!("Successfully imported OCEL:");
println!(" Events: {}", ocel.events.len());
println!(" Objects: {}", ocel.objects.len());
println!(
" Event Types: {}",
ocel.event_types
.iter()
.map(|et| et.name.as_str())
.collect::<Vec<_>>()
.join(", ")
);
println!(
" Object Types: {}",
ocel.object_types
.iter()
.map(|ot| ot.name.as_str())
.collect::<Vec<_>>()
.join(", ")
);
let total_obj_attrs: usize = ocel.objects.iter().map(|o| o.attributes.len()).sum();
let total_o2o_rels: usize = ocel.objects.iter().map(|o| o.relationships.len()).sum();
println!(" Object Attributes: {}", total_obj_attrs);
println!(" O2O Relationships: {}", total_o2o_rels);
println!();
println!("Exporting to CSV: {:?}", output_path);
export_ocel_csv_to_path(&ocel, &output_path)?;
println!("Successfully exported OCEL to CSV format.");
println!();
println!("Preview of output (first 10 lines):");
println!("---");
let content = std::fs::read_to_string(&output_path)?;
for (i, line) in content.lines().take(10).enumerate() {
let display_line = if line.len() > 120 {
format!("{}...", &line[..117])
} else {
line.to_string()
};
println!("{}: {}", i + 1, display_line);
}
if content.lines().count() > 10 {
println!("... ({} more lines)", content.lines().count() - 10);
}
println!("---");
Ok(())
}