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:15 +00:00
|
|
|
fn build_kanji(row: SqliteRow) -> Kanji {
|
|
|
|
let character = row.get("Character");
|
|
|
|
let meaning = row.get("Meaning");
|
|
|
|
let most_used_rank = row.get("MostUsedRank");
|
|
|
|
Kanji {
|
|
|
|
character,
|
|
|
|
meaning,
|
|
|
|
most_used_rank,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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:15 +00:00
|
|
|
let kanji = result.into_iter().map(build_kanji).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
|
|
|
|
AND Kanji.Character = ?
|
|
|
|
"#,
|
|
|
|
)
|
|
|
|
.bind(character)
|
|
|
|
.fetch_one(&db.0)
|
|
|
|
.await
|
|
|
|
.map_err(|_| ())?;
|
|
|
|
|
|
|
|
Ok(Some(build_kanji(result)))
|
|
|
|
}
|