use clap::{Parser, ValueEnum};
use rusto::{DetectTextResult, ImageSource, InitializeConfig, OcrRunOptions, RustO};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "rusto")]
#[command(about = "RustO! - Pure Rust OCR powered by PaddleOCR engine", long_about = None)]
struct Cli {
#[arg(long)]
det_model: PathBuf,
#[arg(long)]
rec_model: PathBuf,
#[arg(long)]
dict: PathBuf,
image: PathBuf,
#[arg(short, long, value_enum, default_value_t = OutputFormat::Json)]
format: OutputFormat,
#[arg(long)]
enable_orient: bool,
#[arg(long)]
orient_model: Option<PathBuf>,
#[arg(long)]
enable_unwarp: bool,
#[arg(long)]
unwarp_model: Option<PathBuf>,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
enum OutputFormat {
Json,
Text,
Tsv,
Markdown,
TextOrdered,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
let mut ocr = RustO::initialize(InitializeConfig::ppv5(&cli.det_model, &cli.rec_model, &cli.dict))?;
if cli.enable_orient || cli.orient_model.is_some() || cli.enable_unwarp || cli.unwarp_model.is_some() {
eprintln!("Warning: CLI optional stages are not configured by this canonical API command.");
}
eprintln!("Processing image...");
let detected = ocr.detect_text(
&ImageSource::Path(cli.image.clone()),
&OcrRunOptions::default(),
)?;
let DetectTextResult::Structured(results) = detected else {
unreachable!("default OCR output is structured lines");
};
eprintln!("✓ OCR completed");
match cli.format {
OutputFormat::Json => println!("{}", serde_json::to_string_pretty(&results)?),
OutputFormat::Text | OutputFormat::TextOrdered => {
for result in &results {
println!("{}", result.text);
}
}
OutputFormat::Tsv => {
for result in &results {
let box_points = result.box_points;
println!(
"{}\t{:.3}\t{:.1},{:.1},{:.1},{:.1},{:.1},{:.1},{:.1},{:.1}",
result.text,
result.score,
box_points[0].0,
box_points[0].1,
box_points[1].0,
box_points[1].1,
box_points[2].0,
box_points[2].1,
box_points[3].0,
box_points[3].1,
);
}
}
OutputFormat::Markdown => {
println!("```");
for result in &results {
println!("{}", result.text);
}
println!("```");
}
}
Ok(())
}