use rust_mando::{to_pinyin_flat, to_pinyin_segmented};
fn usage() {
eprintln!(
"\
Usage: cargo demo <COMMAND> <INPUT>
Commands:
flat Space-separated pīnyīn (marks + numbers)
segment Word-boundary breakdown with pīnyīn per segment
Arguments:
<INPUT> Chinese text to process (quote multi-word strings)
Mixed Latin+Chinese input is supported.
Examples:
cargo demo flat 今天天氣真好
cargo demo segment 自然語言處理"
);
}
const STYLES: [&str; 2] = ["marks", "numbers"];
fn cmd_flat(input: &str) {
let sep = || println!("{}", "─".repeat(50));
sep();
println!("Input: {input}");
sep();
for style in STYLES {
println!(" {style:<10} {}", to_pinyin_flat(input, style));
}
sep();
}
fn cmd_segment(input: &str) {
let sep = || println!("{}", "─".repeat(50));
sep();
println!("Input: {input}");
sep();
println!(" {:<20} {:<25} {}", "Word", "marks", "numbers");
println!(" {}", "·".repeat(46));
let marks_segs = to_pinyin_segmented(input, "marks");
let numbers_segs = to_pinyin_segmented(input, "numbers");
for (m, n) in marks_segs.iter().zip(numbers_segs.iter()) {
println!(
" {:<20} {:<25} {}",
m.word,
m.pinyin.as_deref().unwrap_or(&[]).join(" "),
n.pinyin.as_deref().unwrap_or(&[]).join(" "),
);
}
sep();
}
fn main() {
let args: Vec<String> = std::env::args().skip(1).collect();
if args.len() != 2 {
usage();
std::process::exit(1);
}
match args[0].as_str() {
"flat" => cmd_flat(&args[1]),
"segment" => cmd_segment(&args[1]),
other => {
eprintln!("error: unknown command `{other}`\n");
usage();
std::process::exit(1);
}
}
}