use tengwar::*;
fn convert<M: TengwarMode + Default, T: FromIterator<Token>>(
input: impl ToTengwar,
settings: TranscriberSettings,
) -> T {
input.transcriber::<M>().with_settings(settings).collect()
}
#[derive(Clone, Copy, Debug, ValueEnum)]
pub enum Language {
#[value(alias = "q", alias = "qya")]
Quenya,
#[value(alias = "s", alias = "sjn")]
Sindarin,
}
#[allow(dead_code)]
impl Language {
pub const fn mode(&self) -> Mode {
match self {
Self::Quenya => Mode::Classical,
Self::Sindarin => Mode::Gondor,
}
}
}
#[derive(Clone, Copy, Debug, ValueEnum)]
pub enum Mode {
#[value(alias = "c")]
Classical,
#[value(alias = "g")]
Gondor,
#[value(alias = "b")]
Beleriand,
}
impl Mode {
#[allow(dead_code)]
pub const DEFAULT: Self = Self::Classical;
pub fn convert<T: FromIterator<Token>>(
&self,
input: impl ToTengwar,
settings: TranscriberSettings,
) -> T {
match self {
Self::Classical => convert::<Quenya, T>(input, settings),
Self::Gondor => convert::<Gondor, T>(input, settings),
Self::Beleriand => convert::<Beleriand, T>(input, settings),
}
}
}
pub struct Runner {
pub mode: Mode,
pub settings: TranscriberSettings,
}
impl Runner {
pub const fn new(mode: Mode, settings: TranscriberSettings) -> Self {
Self { mode, settings }
}
pub fn convert<T: FromIterator<Token>>(&self, input: impl ToTengwar) -> T {
self.mode.convert::<T>(input, self.settings)
}
}