2023-06-11 20:08:17 +00:00
|
|
|
use sqlx::{sqlite::SqliteRow, Encode, Row, SqlitePool, Type};
|
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:17 +00:00
|
|
|
character: Option<String>,
|
|
|
|
|
|
|
|
#[serde(default = "default_how_many")]
|
2023-06-11 20:08:15 +00:00
|
|
|
#[derivative(Default(value = "10"))]
|
|
|
|
how_many: u32,
|
|
|
|
}
|
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
fn default_how_many() -> u32 {
|
|
|
|
10
|
|
|
|
}
|
|
|
|
|
2023-06-11 20:08:15 +00:00
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
|
|
pub struct Kanji {
|
|
|
|
character: String,
|
|
|
|
most_used_rank: u32,
|
2023-06-11 20:08:17 +00:00
|
|
|
meanings: Vec<KanjiMeaning>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
|
|
pub struct KanjiMeaning {
|
|
|
|
id: u32,
|
|
|
|
meaning: String,
|
2023-06-11 20:08:15 +00:00
|
|
|
}
|
|
|
|
|
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
|
|
|
#[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>,
|
2023-06-11 20:08:17 +00:00
|
|
|
) -> Result<GetKanjiResult, String> {
|
2023-06-11 20:08:15 +00:00
|
|
|
let opts = options.unwrap_or_default();
|
2023-06-11 20:08:17 +00:00
|
|
|
println!("Options: {:?}", opts);
|
2023-06-11 20:08:15 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
let looking_for_character_clause = match opts.character {
|
|
|
|
None => String::new(),
|
|
|
|
Some(_) => format!(" AND KanjiSet.Character = ?"),
|
|
|
|
};
|
|
|
|
|
|
|
|
let query_string = format!(
|
2023-06-11 20:08:15 +00:00
|
|
|
r#"
|
2023-06-11 20:08:17 +00:00
|
|
|
SELECT *, KanjiMeaningSet.ID as KanjiMeaningID
|
|
|
|
FROM (
|
|
|
|
SELECT *
|
|
|
|
FROM KanjiSet
|
|
|
|
WHERE MostUsedRank IS NOT NULL
|
|
|
|
{looking_for_character_clause}
|
|
|
|
ORDER BY MostUsedRank LIMIT ?
|
|
|
|
) as Kanji
|
|
|
|
JOIN KanjiMeaningSet ON Kanji.ID = KanjiMeaningSet.Kanji_ID
|
|
|
|
ORDER BY MostUsedRank, KanjiMeaningSet.ID
|
2023-06-11 20:08:15 +00:00
|
|
|
"#,
|
2023-06-11 20:08:17 +00:00
|
|
|
);
|
2023-06-11 20:08:15 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
let mut query = sqlx::query(&query_string);
|
2023-06-11 20:08:15 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
// Do all the binds
|
|
|
|
|
|
|
|
if let Some(character) = opts.character {
|
|
|
|
println!("Bind {}", character);
|
|
|
|
query = query.bind(character);
|
|
|
|
}
|
|
|
|
|
|
|
|
println!("Bind {}", opts.how_many);
|
|
|
|
query = query.bind(opts.how_many);
|
|
|
|
|
|
|
|
println!("Query: {query_string}");
|
|
|
|
|
|
|
|
let result = query
|
|
|
|
.fetch_all(&db.0)
|
2023-06-11 20:08:15 +00:00
|
|
|
.await
|
2023-06-11 20:08:17 +00:00
|
|
|
.map_err(|err| err.to_string())?;
|
2023-06-11 20:08:15 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
let kanji = {
|
|
|
|
let mut new_vec: Vec<Kanji> = Vec::with_capacity(result.len());
|
|
|
|
let mut last_character: Option<String> = None;
|
2023-06-11 20:08:15 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
for row in result {
|
|
|
|
let character: String = row.get("Character");
|
|
|
|
let most_used_rank = row.get("MostUsedRank");
|
|
|
|
|
|
|
|
let meaning = KanjiMeaning {
|
|
|
|
id: row.get("KanjiMeaningID"),
|
|
|
|
meaning: row.get("Meaning"),
|
|
|
|
};
|
|
|
|
|
|
|
|
let same_as = match last_character {
|
|
|
|
Some(ref last_character) if character == *last_character => {
|
|
|
|
Some(new_vec.last_mut().unwrap())
|
|
|
|
}
|
|
|
|
Some(_) => None,
|
|
|
|
None => None,
|
|
|
|
};
|
2023-06-11 20:08:15 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
last_character = Some(character.clone());
|
2023-06-11 20:08:16 +00:00
|
|
|
|
2023-06-11 20:08:17 +00:00
|
|
|
if let Some(kanji) = same_as {
|
|
|
|
kanji.meanings.push(meaning);
|
|
|
|
} else {
|
|
|
|
new_vec.push(Kanji {
|
|
|
|
character,
|
|
|
|
most_used_rank,
|
|
|
|
meanings: vec![meaning],
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
new_vec
|
|
|
|
};
|
|
|
|
|
|
|
|
println!("Result: {kanji:?}");
|
|
|
|
|
|
|
|
let count = sqlx::query("SELECT COUNT(*) FROM KanjiSet")
|
|
|
|
.fetch_one(&db.0)
|
|
|
|
.await
|
|
|
|
.map_err(|err| err.to_string())?;
|
|
|
|
let count = count.try_get(0).map_err(|err| err.to_string())?;
|
|
|
|
|
|
|
|
Ok(GetKanjiResult { kanji, count })
|
2023-06-11 20:08:15 +00:00
|
|
|
}
|