use clap::{Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(
name = "bauske",
version,
about = "Browse Relojban phonology data and representative distances"
)]
pub(crate) struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub(crate) enum Command {
Inventory {
#[arg(long, value_enum, default_value_t = InventoryKind::Alphabet)]
kind: InventoryKind,
},
Compare {
left: String,
right: String,
#[arg(long, value_enum, default_value_t = ProfileArg::RepresentativesV1)]
profile: ProfileArg,
},
Profiles,
Analyze {
word: String,
#[arg(long, value_enum)]
kind: WordKindArg,
#[arg(long = "syllabic-at", value_name = "N", action = clap::ArgAction::Append)]
syllabic_at: Vec<usize>,
},
Cluster {
cluster: String,
#[arg(long, value_enum)]
position: ClusterPositionArg,
#[arg(long, value_enum)]
kind: WordKindArg,
},
Prosody {
word: String,
#[arg(long, value_enum)]
kind: WordKindArg,
#[arg(long = "syllabic-at", value_name = "BYTE", action = clap::ArgAction::Append)]
syllabic_at: Vec<usize>,
#[arg(long = "buffer-after", value_name = "BYTE", action = clap::ArgAction::Append)]
buffer_after: Vec<usize>,
#[arg(long, value_enum, default_value_t = SyllablesArg::Canonical)]
syllables: SyllablesArg,
#[arg(long, value_name = "NUCLEUS", conflicts_with = "unstressed")]
primary: Option<usize>,
#[arg(long)]
unstressed: bool,
#[arg(long, value_enum, default_value_t = FollowingArg::Unspecified)]
following: FollowingArg,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum ProfileArg {
RepresentativesV1,
#[value(name = "close-mid-e-v1")]
CloseMidEV1,
}
impl From<ProfileArg> for bauske_phonology::PronunciationProfile {
fn from(value: ProfileArg) -> Self {
match value {
ProfileArg::RepresentativesV1 => Self::RepresentativesV1,
ProfileArg::CloseMidEV1 => Self::CloseMidEV1,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum SyllablesArg {
Canonical,
Hints,
}
impl From<SyllablesArg> for bauske_phonology::SyllabificationMode {
fn from(value: SyllablesArg) -> Self {
match value {
SyllablesArg::Canonical => Self::Canonical,
SyllablesArg::Hints => Self::WrittenHints,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum FollowingArg {
Unspecified,
BrivlaUnpaused,
BrivlaPaused,
}
impl From<FollowingArg> for bauske_phonology::FollowingContext {
fn from(value: FollowingArg) -> Self {
match value {
FollowingArg::Unspecified => Self::Unspecified,
FollowingArg::BrivlaUnpaused => Self::BrivlaUnpaused,
FollowingArg::BrivlaPaused => Self::BrivlaAfterPause,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum InventoryKind {
Alphabet,
Consonant,
Vowel,
Diphthong,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum WordKindArg {
Brivla,
Cmavo,
Cmevla,
Zihevla,
#[value(name = "gismu-lujvo")]
GismuLujvo,
}
impl From<WordKindArg> for bauske_phonology::WordKind {
fn from(value: WordKindArg) -> Self {
match value {
WordKindArg::Brivla => Self::Brivla,
WordKindArg::Cmavo => Self::Cmavo,
WordKindArg::Cmevla => Self::Cmevla,
WordKindArg::Zihevla => Self::Zihevla,
WordKindArg::GismuLujvo => Self::GismuBasedLujvo,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum ClusterPositionArg {
Initial,
Medial,
Final,
}
impl From<ClusterPositionArg> for bauske_phonology::ClusterPosition {
fn from(value: ClusterPositionArg) -> Self {
match value {
ClusterPositionArg::Initial => Self::Initial,
ClusterPositionArg::Medial => Self::Medial,
ClusterPositionArg::Final => Self::Final,
}
}
}