use crate::config::Config;
use crate::paths::Paths;
use anyhow::{bail, Context, Result};
use clap::Args as ClapArgs;
use furigana::{Furigana, RomajiStyle, TtsOptions};
use std::path::PathBuf;
#[derive(ClapArgs, Debug)]
pub struct Args {
text: String,
#[arg(short, long, default_value = "tts")]
mode: String,
#[arg(long)]
rules_dir: Option<PathBuf>,
#[arg(long)]
core_dict_dir: Vec<PathBuf>,
#[arg(long, default_value = " ")]
short_pause: String,
#[arg(long, default_value = " ")]
long_pause: String,
#[arg(long)]
drop_period: bool,
}
pub fn run(args: Args, paths: &Paths, _cfg: &Config) -> Result<()> {
let f = if args.rules_dir.is_some() || !args.core_dict_dir.is_empty() {
let mut b = Furigana::builder();
if let Some(rules) = &args.rules_dir {
b = b.rules_dir(rules);
}
for core in &args.core_dict_dir {
b = b.core_dict_dir(core);
}
b.build()?
} else {
super::build_furigana(paths)?
};
let result = match args.mode.as_str() {
"kanji" => args.text.clone(),
"ruby" => f.to_ruby(&args.text),
"hiragana" | "hira" => f.to_hiragana(&args.text),
"romaji" => f.to_romaji(&args.text, RomajiStyle::Hepburn),
"romaji-kunrei" | "kunrei" => f.to_romaji(&args.text, RomajiStyle::Kunrei),
"tts" => {
let opts = TtsOptions {
short_pause: args.short_pause,
long_pause: args.long_pause,
keep_period: !args.drop_period,
};
f.to_tts(&args.text, &opts)
}
"analyze" => {
let result = f.analyze(&args.text);
serde_json::to_string_pretty(&result).context("serialize AnalyzeResult to JSON")?
}
"accent" => {
let result = f.to_accent(&args.text);
serde_json::to_string_pretty(&result).context("serialize AccentResult to JSON")?
}
other => bail!(
"未知の mode: {other} (使用可能: tts | hiragana | ruby | kanji | romaji | romaji-kunrei | analyze | accent)"
),
};
println!("{result}");
Ok(())
}