houhou/src-tauri/src/kanji.rs

97 lines
2.1 KiB
Rust
Raw Normal View History

2023-06-11 20:08:15 +00:00
use sqlx::{sqlite::SqliteRow, Row, SqlitePool};
2023-06-11 20:08:15 +00:00
use tauri::State;
pub struct KanjiDb(pub SqlitePool);
2023-06-11 20:08:15 +00:00
#[derive(Debug, Derivative, Serialize, Deserialize)]
#[derivative(Default)]
pub struct GetKanjiOptions {
2023-06-11 20:08:15 +00:00
#[serde(default)]
2023-06-11 20:08:15 +00:00
#[derivative(Default(value = "10"))]
how_many: u32,
}
2023-06-11 20:08:15 +00:00
#[derive(Debug, Serialize, Deserialize)]
pub struct Kanji {
character: String,
meaning: String,
most_used_rank: u32,
}
2023-06-11 20:08:15 +00:00
#[derive(Debug, Serialize, Deserialize)]
pub struct GetKanjiResult {
count: u32,
2023-06-11 20:08:15 +00:00
kanji: Vec<Kanji>,
2023-06-11 20:08:15 +00:00
}
2023-06-11 20:08:16 +00:00
impl Kanji {
fn from_sqlite_row(row: SqliteRow) -> Self {
let character = row.get("Character");
let meaning = row.get("Meaning");
let most_used_rank = row.get("MostUsedRank");
2023-06-11 20:08:16 +00:00
2023-06-11 20:08:16 +00:00
Kanji {
character,
meaning,
most_used_rank,
}
2023-06-11 20:08:15 +00:00
}
}
2023-06-11 20:08:15 +00:00
#[tauri::command]
2023-06-11 20:08:15 +00:00
pub async fn get_kanji(
2023-06-11 20:08:15 +00:00
db: State<'_, KanjiDb>,
2023-06-11 20:08:15 +00:00
options: Option<GetKanjiOptions>,
) -> Result<GetKanjiResult, ()> {
let opts = options.unwrap_or_default();
let result = sqlx::query(
2023-06-11 20:08:15 +00:00
r#"
2023-06-11 20:08:15 +00:00
SELECT * FROM KanjiSet
LEFT JOIN KanjiMeaningSet ON KanjiSet.ID = KanjiMeaningSet.Kanji_ID
GROUP BY KanjiSet.ID
HAVING MostUsedRank IS NOT NULL
ORDER BY MostUsedRank
LIMIT ?
2023-06-11 20:08:15 +00:00
"#,
2023-06-11 20:08:15 +00:00
)
.bind(opts.how_many)
2023-06-11 20:08:15 +00:00
.fetch_all(&db.0)
2023-06-11 20:08:15 +00:00
.await
.map_err(|_| ())?;
2023-06-11 20:08:16 +00:00
let kanji = result.into_iter().map(Kanji::from_sqlite_row).collect();
2023-06-11 20:08:15 +00:00
let count = sqlx::query("SELECT COUNT(*) FROM KanjiSet")
2023-06-11 20:08:15 +00:00
.fetch_one(&db.0)
2023-06-11 20:08:15 +00:00
.await
.map_err(|_| ())?;
2023-06-11 20:08:15 +00:00
let count = count.try_get(0).map_err(|_| ())?;
2023-06-11 20:08:15 +00:00
2023-06-11 20:08:15 +00:00
Ok(GetKanjiResult { kanji, count })
2023-06-11 20:08:15 +00:00
}
2023-06-11 20:08:15 +00:00
#[tauri::command]
pub async fn get_single_kanji(
db: State<'_, KanjiDb>,
character: String,
) -> Result<Option<Kanji>, ()> {
let result = sqlx::query(
r#"
SELECT * FROM KanjiSet
LEFT JOIN KanjiMeaningSet ON KanjiSet.ID = KanjiMeaningSet.Kanji_ID
GROUP BY KanjiSet.ID
HAVING MostUsedRank IS NOT NULL
2023-06-11 20:08:16 +00:00
AND KanjiSet.Character = ?
2023-06-11 20:08:15 +00:00
"#,
)
.bind(character)
.fetch_one(&db.0)
.await
.map_err(|_| ())?;
2023-06-11 20:08:16 +00:00
let kanji = Kanji::from_sqlite_row(result);
Ok(Some(kanji))
2023-06-11 20:08:15 +00:00
}