#![allow(deprecated)]
use crate::{Pinyin, ToPinyin, ToPinyinMulti};
use std::collections::HashSet;
use std::convert::identity;
#[deprecated = "请使用 `Pinyin` 的方法代替"]
#[derive(Debug, PartialEq, Eq, Hash)]
pub enum Style {
Normal,
Tone,
Tone2,
Initials,
FirstLetter,
Finals,
FinalsTone,
FinalsTone2,
}
#[deprecated]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct Args {
pub style: Style,
pub heteronym: bool,
}
impl Args {
pub fn new() -> Args {
Args {
style: Style::Normal,
heteronym: false,
}
}
}
impl Default for Args {
fn default() -> Self {
Self::new()
}
}
fn apply_style(py: Pinyin, style: &Style) -> &'static str {
match style {
Style::Normal => py.plain(),
Style::Tone => py.with_tone(),
Style::Tone2 => py.with_tone_num(),
Style::Initials => py.initials(),
Style::FirstLetter => py.first_letter(),
Style::Finals => py.finals_plain(),
Style::FinalsTone => py.finals_with_tone(),
Style::FinalsTone2 => py.finals_with_tone_num(),
}
}
#[deprecated = "请使用 `ToPinyin` 或 `ToPinyinMulti` 代替"]
pub fn pinyin(s: &str, a: &Args) -> Vec<Vec<String>> {
if a.heteronym {
s.to_pinyin_multi()
.map(|multi| match multi {
Some(multi) => {
let mut set = HashSet::new();
multi
.into_iter()
.map(|pinyin| apply_style(pinyin, &a.style))
.filter(|s| set.insert(*s))
.map(str::to_string)
.collect()
}
None => vec![],
})
.collect()
} else {
s.to_pinyin()
.map(|pinyin| match pinyin {
Some(pinyin) => vec![apply_style(pinyin, &a.style).to_string()],
None => vec![],
})
.collect()
}
}
#[deprecated = "请使用 `ToPinyin` 代替"]
pub fn lazy_pinyin(s: &str, a: &Args) -> Vec<String> {
s.to_pinyin()
.filter_map(identity)
.map(|pinyin| apply_style(pinyin, &a.style).to_string())
.collect()
}