sakurs_core/api/
language.rs

1//! Language type for the API
2
3use crate::api::Error;
4use std::fmt;
5use std::str::FromStr;
6
7/// Supported languages for sentence segmentation
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
9pub enum Language {
10    /// English language with standard English rules
11    #[default]
12    English,
13    /// Japanese language with specific punctuation rules
14    Japanese,
15}
16
17impl Language {
18    /// Create a Language from a language code
19    pub fn from_code(code: &str) -> Self {
20        match code.trim().to_lowercase().as_str() {
21            "en" | "eng" | "english" => Language::English,
22            "ja" | "jpn" | "japanese" => Language::Japanese,
23            _ => Language::English, // Default to English
24        }
25    }
26
27    /// Get the language code
28    pub fn code(&self) -> &'static str {
29        match self {
30            Language::English => "en",
31            Language::Japanese => "ja",
32        }
33    }
34
35    /// Get the full language name
36    pub fn name(&self) -> &'static str {
37        match self {
38            Language::English => "English",
39            Language::Japanese => "Japanese",
40        }
41    }
42}
43
44impl fmt::Display for Language {
45    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46        write!(f, "{}", self.name())
47    }
48}
49
50impl FromStr for Language {
51    type Err = Error;
52
53    fn from_str(s: &str) -> Result<Self, Self::Err> {
54        match s.trim().to_lowercase().as_str() {
55            "en" | "eng" | "english" => Ok(Language::English),
56            "ja" | "jpn" | "japanese" => Ok(Language::Japanese),
57            _ => Err(Error::InvalidLanguage(format!("Unsupported language: {s}"))),
58        }
59    }
60}