Skip to content

Commit 8145b23

Browse files
authored
add language crate for conversions (#332)
1 parent 9929738 commit 8145b23

File tree

27 files changed

+538
-80
lines changed

27 files changed

+538
-80
lines changed

Cargo.lock

Lines changed: 17 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ hypr-file = { path = "crates/file", package = "file" }
3030
hypr-gbnf = { path = "crates/gbnf", package = "gbnf" }
3131
hypr-gguf = { path = "crates/gguf", package = "gguf" }
3232
hypr-host = { path = "crates/host", package = "host" }
33+
hypr-language = { path = "crates/language", package = "language" }
3334
hypr-llama = { path = "crates/llama", package = "llama" }
3435
hypr-loops = { path = "crates/loops", package = "loops" }
3536
hypr-nango = { path = "crates/nango", package = "nango" }

apps/desktop/src-tauri/src/lib.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,21 @@ use store::*;
77

88
use tauri_plugin_windows::{HyprWindow, WindowsPluginExt};
99

10-
use tracing_subscriber::{prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt};
10+
use tracing_subscriber::{
11+
fmt, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt, EnvFilter,
12+
};
1113

1214
#[tokio::main]
1315
pub async fn main() {
1416
tauri::async_runtime::set(tokio::runtime::Handle::current());
1517

1618
{
19+
let env_filter =
20+
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
21+
1722
tracing_subscriber::Registry::default()
23+
.with(fmt::layer())
24+
.with(env_filter)
1825
.with(tauri_plugin_sentry::sentry::integrations::tracing::layer())
1926
.init();
2027
}

crates/db-user/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ hypr-buffer = { workspace = true }
88
hypr-calendar-interface = { workspace = true }
99
hypr-data = { workspace = true }
1010
hypr-db-core = { workspace = true }
11+
hypr-language = { workspace = true }
1112
hypr-listener-interface = { workspace = true }
1213
hypr-timeline = { workspace = true }
1314

crates/db-user/src/config_types.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use codes_iso_639::part_1::LanguageCode;
21
use serde::Deserialize;
32
use std::str::FromStr;
43

@@ -40,8 +39,8 @@ user_common_derives! {
4039
pub autostart: bool,
4140
#[specta(type = String)]
4241
#[schemars(with = "String", regex(pattern = "^[a-zA-Z]{2}$"))]
43-
#[serde(serialize_with = "serialize_language_code", deserialize_with = "deserialize_language_code")]
44-
pub display_language: LanguageCode,
42+
#[serde(serialize_with = "serialize_language", deserialize_with = "deserialize_language")]
43+
pub display_language: hypr_language::Language,
4544
pub jargons: Vec<String>,
4645
pub telemetry_consent: bool,
4746
}
@@ -51,7 +50,7 @@ impl Default for ConfigGeneral {
5150
fn default() -> Self {
5251
Self {
5352
autostart: false,
54-
display_language: LanguageCode::En,
53+
display_language: hypr_language::ISO639::En.into(),
5554
jargons: vec![],
5655
telemetry_consent: true,
5756
}
@@ -85,16 +84,18 @@ user_common_derives! {
8584
}
8685
}
8786

88-
fn serialize_language_code<S: serde::Serializer>(
89-
code: &LanguageCode,
87+
fn serialize_language<S: serde::Serializer>(
88+
lang: &hypr_language::Language,
9089
serializer: S,
9190
) -> Result<S::Ok, S::Error> {
92-
serializer.serialize_str(code.code())
91+
let code = lang.iso639().code();
92+
serializer.serialize_str(code)
9393
}
9494

95-
fn deserialize_language_code<'de, D: serde::Deserializer<'de>>(
95+
fn deserialize_language<'de, D: serde::Deserializer<'de>>(
9696
deserializer: D,
97-
) -> Result<LanguageCode, D::Error> {
98-
let s = String::deserialize(deserializer)?;
99-
LanguageCode::from_str(&s).map_err(serde::de::Error::custom)
97+
) -> Result<hypr_language::Language, D::Error> {
98+
let str = String::deserialize(deserializer)?;
99+
let iso639 = hypr_language::ISO639::from_str(&str).map_err(serde::de::Error::custom)?;
100+
Ok(iso639.into())
100101
}

crates/language/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "language"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[features]
7+
default = ["whisper"]
8+
whisper = ["dep:hypr-whisper"]
9+
deepgram = ["dep:deepgram"]
10+
11+
[dependencies]
12+
codes-iso-639 = { workspace = true }
13+
14+
deepgram = { workspace = true, optional = true, features = ["listen"] }
15+
hypr-whisper = { workspace = true, optional = true }
16+
17+
serde = { workspace = true }
18+
thiserror = { workspace = true }

crates/language/src/error.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use serde::{ser::Serializer, Serialize};
2+
3+
#[derive(Debug, thiserror::Error)]
4+
pub enum Error {
5+
#[error("Not supported language: {0}")]
6+
NotSupportedLanguage(codes_iso_639::part_1::LanguageCode),
7+
}
8+
9+
impl Serialize for Error {
10+
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
11+
where
12+
S: Serializer,
13+
{
14+
serializer.serialize_str(self.to_string().as_ref())
15+
}
16+
}

crates/language/src/lib.rs

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
mod error;
2+
pub use error::*;
3+
4+
pub use codes_iso_639::part_1::LanguageCode as ISO639;
5+
6+
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
7+
pub struct Language {
8+
iso639: ISO639,
9+
}
10+
11+
impl Default for Language {
12+
fn default() -> Self {
13+
Self { iso639: ISO639::En }
14+
}
15+
}
16+
17+
impl From<ISO639> for Language {
18+
fn from(language: ISO639) -> Self {
19+
Self { iso639: language }
20+
}
21+
}
22+
23+
impl std::ops::Deref for Language {
24+
type Target = ISO639;
25+
26+
fn deref(&self) -> &Self::Target {
27+
&self.iso639
28+
}
29+
}
30+
31+
impl Language {
32+
pub fn iso639(&self) -> ISO639 {
33+
self.iso639
34+
}
35+
36+
#[cfg(feature = "whisper")]
37+
pub fn for_whisper(self) -> Result<hypr_whisper::Language, Error> {
38+
use hypr_whisper::Language as WL;
39+
40+
match self.iso639 {
41+
ISO639::Af => Ok(WL::Af),
42+
ISO639::Am => Ok(WL::Am),
43+
ISO639::Ar => Ok(WL::Ar),
44+
ISO639::As => Ok(WL::As),
45+
ISO639::Az => Ok(WL::Az),
46+
ISO639::Ba => Ok(WL::Ba),
47+
ISO639::Be => Ok(WL::Be),
48+
ISO639::Bg => Ok(WL::Bg),
49+
ISO639::Bn => Ok(WL::Bn),
50+
ISO639::Bo => Ok(WL::Bo),
51+
ISO639::Br => Ok(WL::Br),
52+
ISO639::Bs => Ok(WL::Bs),
53+
ISO639::Ca => Ok(WL::Ca),
54+
ISO639::Cs => Ok(WL::Cs),
55+
ISO639::Cy => Ok(WL::Cy),
56+
ISO639::Da => Ok(WL::Da),
57+
ISO639::De => Ok(WL::De),
58+
ISO639::El => Ok(WL::El),
59+
ISO639::En => Ok(WL::En),
60+
ISO639::Es => Ok(WL::Es),
61+
ISO639::Et => Ok(WL::Et),
62+
ISO639::Eu => Ok(WL::Eu),
63+
ISO639::Fa => Ok(WL::Fa),
64+
ISO639::Fi => Ok(WL::Fi),
65+
ISO639::Fo => Ok(WL::Fo),
66+
ISO639::Fr => Ok(WL::Fr),
67+
ISO639::Gl => Ok(WL::Gl),
68+
ISO639::Gu => Ok(WL::Gu),
69+
ISO639::Ha => Ok(WL::Ha),
70+
ISO639::He => Ok(WL::He),
71+
ISO639::Hi => Ok(WL::Hi),
72+
ISO639::Hr => Ok(WL::Hr),
73+
ISO639::Ht => Ok(WL::Ht),
74+
ISO639::Hu => Ok(WL::Hu),
75+
ISO639::Hy => Ok(WL::Hy),
76+
ISO639::Id => Ok(WL::Id),
77+
ISO639::Is => Ok(WL::Is),
78+
ISO639::It => Ok(WL::It),
79+
ISO639::Ja => Ok(WL::Ja),
80+
ISO639::Jv => Ok(WL::Jw),
81+
ISO639::Ka => Ok(WL::Ka),
82+
ISO639::Kk => Ok(WL::Kk),
83+
ISO639::Km => Ok(WL::Km),
84+
ISO639::Kn => Ok(WL::Kn),
85+
ISO639::Ko => Ok(WL::Ko),
86+
ISO639::La => Ok(WL::La),
87+
ISO639::Lb => Ok(WL::Lb),
88+
ISO639::Lo => Ok(WL::Lo),
89+
ISO639::Lt => Ok(WL::Lt),
90+
ISO639::Lv => Ok(WL::Lv),
91+
ISO639::Mg => Ok(WL::Mg),
92+
ISO639::Mi => Ok(WL::Mi),
93+
ISO639::Mk => Ok(WL::Mk),
94+
ISO639::Ml => Ok(WL::Ml),
95+
ISO639::Mn => Ok(WL::Mn),
96+
ISO639::Mr => Ok(WL::Mr),
97+
ISO639::Ms => Ok(WL::Ms),
98+
ISO639::Mt => Ok(WL::Mt),
99+
ISO639::My => Ok(WL::My),
100+
ISO639::Ne => Ok(WL::Ne),
101+
ISO639::Nl => Ok(WL::Nl),
102+
ISO639::Nn => Ok(WL::Nn),
103+
ISO639::No => Ok(WL::No),
104+
ISO639::Oc => Ok(WL::Oc),
105+
ISO639::Pa => Ok(WL::Pa),
106+
ISO639::Pl => Ok(WL::Pl),
107+
ISO639::Ps => Ok(WL::Ps),
108+
ISO639::Pt => Ok(WL::Pt),
109+
ISO639::Ro => Ok(WL::Ro),
110+
ISO639::Ru => Ok(WL::Ru),
111+
ISO639::Sa => Ok(WL::Sa),
112+
ISO639::Sd => Ok(WL::Sd),
113+
ISO639::Si => Ok(WL::Si),
114+
ISO639::Sk => Ok(WL::Sk),
115+
ISO639::Sl => Ok(WL::Sl),
116+
ISO639::Sn => Ok(WL::Sn),
117+
ISO639::So => Ok(WL::So),
118+
ISO639::Sq => Ok(WL::Sq),
119+
ISO639::Sr => Ok(WL::Sr),
120+
ISO639::Su => Ok(WL::Su),
121+
ISO639::Sv => Ok(WL::Sv),
122+
ISO639::Sw => Ok(WL::Sw),
123+
ISO639::Ta => Ok(WL::Ta),
124+
ISO639::Te => Ok(WL::Te),
125+
ISO639::Tg => Ok(WL::Tg),
126+
ISO639::Th => Ok(WL::Th),
127+
ISO639::Tk => Ok(WL::Tk),
128+
ISO639::Tl => Ok(WL::Tl),
129+
ISO639::Tr => Ok(WL::Tr),
130+
ISO639::Tt => Ok(WL::Tt),
131+
ISO639::Uk => Ok(WL::Uk),
132+
ISO639::Ur => Ok(WL::Ur),
133+
ISO639::Uz => Ok(WL::Uz),
134+
ISO639::Vi => Ok(WL::Vi),
135+
ISO639::Yi => Ok(WL::Yi),
136+
ISO639::Yo => Ok(WL::Yo),
137+
ISO639::Zh => Ok(WL::Zh),
138+
_ => Err(Error::NotSupportedLanguage(self.iso639)),
139+
}
140+
}
141+
142+
#[cfg(feature = "deepgram")]
143+
pub fn for_deepgram(self) -> Result<deepgram::common::options::Language, Error> {
144+
use deepgram::common::options::Language as DG;
145+
146+
match self.iso639 {
147+
ISO639::Bg => Ok(DG::bg),
148+
ISO639::Ca => Ok(DG::ca),
149+
ISO639::Cs => Ok(DG::cs),
150+
ISO639::Da => Ok(DG::da),
151+
ISO639::De => Ok(DG::de),
152+
ISO639::El => Ok(DG::el),
153+
ISO639::En => Ok(DG::en),
154+
ISO639::Es => Ok(DG::es),
155+
ISO639::Et => Ok(DG::et),
156+
ISO639::Fi => Ok(DG::fi),
157+
ISO639::Fr => Ok(DG::fr),
158+
ISO639::Hi => Ok(DG::hi),
159+
ISO639::Hu => Ok(DG::hu),
160+
ISO639::Id => Ok(DG::id),
161+
ISO639::It => Ok(DG::it),
162+
ISO639::Ja => Ok(DG::ja),
163+
ISO639::Ko => Ok(DG::ko),
164+
ISO639::Lt => Ok(DG::lt),
165+
ISO639::Lv => Ok(DG::lv),
166+
ISO639::Ms => Ok(DG::ms),
167+
ISO639::Nl => Ok(DG::nl),
168+
ISO639::No => Ok(DG::no),
169+
ISO639::Pl => Ok(DG::pl),
170+
ISO639::Pt => Ok(DG::pt),
171+
ISO639::Ro => Ok(DG::ro),
172+
ISO639::Ru => Ok(DG::ru),
173+
ISO639::Sk => Ok(DG::sk),
174+
ISO639::Sv => Ok(DG::sv),
175+
ISO639::Ta => Ok(DG::ta),
176+
ISO639::Th => Ok(DG::th),
177+
ISO639::Tr => Ok(DG::tr),
178+
ISO639::Uk => Ok(DG::uk),
179+
ISO639::Vi => Ok(DG::vi),
180+
ISO639::Zh => Ok(DG::zh),
181+
_ => Err(Error::NotSupportedLanguage(self.iso639)),
182+
}
183+
}
184+
}

0 commit comments

Comments
 (0)