houhou/src-tauri/src/kanji.rs

48 lines
1.1 KiB
Rust
Raw Normal View History

2023-06-11 20:08:15 +00:00
use sqlx::{Row, SqlitePool};
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 {
#[derivative(Default(value = "10"))]
how_many: u32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct GetKanjiResult {
count: u32,
kanji: Vec<String>,
}
2023-06-11 20:08:15 +00:00
#[tauri::command]
2023-06-11 20:08:15 +00:00
pub async fn get_kanji(
state: State<'_, KanjiDb>,
options: Option<GetKanjiOptions>,
) -> Result<GetKanjiResult, ()> {
let opts = options.unwrap_or_default();
let result = sqlx::query(
r#"SELECT * FROM KanjiSet
LEFT JOIN KanjiMeaningSet ON KanjiSet.ID = KanjiMeaningSet.Kanji_ID
WHERE MostUsedRank IS NOT NULL
ORDER BY MostUsedRank
LIMIT ?"#,
)
.bind(opts.how_many)
.fetch_all(&state.0)
.await
.map_err(|_| ())?;
let kanji = result.into_iter().map(|row| row.get("Character")).collect();
let count = sqlx::query("SELECT COUNT(*) FROM KanjiSet")
.fetch_one(&state.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
}