rust-mando 0.1.2

Convert Chinese characters to pinyin with jieba word segmentation
Documentation
//! CLI tool — converts Chinese text to pīnyīn.
//!
//! Run with:  cargo demo <COMMAND> <INPUT>
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);
        }
    }
}