Migrate to Id type

This commit is contained in:
2026-08-18 12:47:06 +03:00
parent 99b3818181
commit 97c76350e1
12 changed files with 106 additions and 62 deletions
+60 -16
View File
@@ -11,8 +11,11 @@ use rayon::iter::IndexedParallelIterator;
use rayon::iter::IntoParallelRefIterator;
use rayon::iter::ParallelIterator;
use rhai::{Engine, Scope};
use serde::{Deserialize, Serialize};
use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef};
use rusqlite::ToSql;
use std::cmp::PartialEq;
use std::collections::HashMap;
use std::fmt::{Display, Formatter};
use std::sync::{Arc, Mutex};
use std::time::Instant;
@@ -20,6 +23,9 @@ const MAX_HISTORY_LEN: usize = 20;
const MAX_HISTORY_LEN_PART: f32 = 0.33;
const MAX_SCORE: u8 = 25;
const FADE_PER_DAY: f32 = 0.95;
#[derive(Clone, PartialEq, Eq, Debug, Hash, Copy)]
pub(crate) struct Id(u32);
pub const INVALID_ID: Id = Id(0);
#[derive(Clone, Debug)]
pub struct KanaSet {
name: String,
@@ -225,40 +231,40 @@ impl PartialEq<Self> for KanaSet {
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[derive(Clone, Debug)]
pub struct WordData {
pub id: u32,
pub id: Id,
pub key: String,
pub value: String,
pub tags: String,
pub additional: HashMap<String, String>,
pub group_id: u32,
pub group_id: Id,
}
impl WordData {
pub fn new() -> Self {
Self {
id: 0,
id: 0.into(),
key: String::new(),
value: String::new(),
tags: String::new(),
additional: Default::default(),
group_id: 1,
group_id: 1.into(),
}
}
}
#[derive(Clone)]
pub struct WordGroup {
pub id: u32,
pub id: Id,
pub name: String,
}
#[derive(Clone, PartialEq)]
pub struct CardStatistics {
pub id: u32,
pub word_id: u32,
pub set_id: u32,
pub id: Id,
pub word_id: Id,
pub set_id: Id,
pub last_open: DateTime<Utc>,
pub score: u8,
}
@@ -320,8 +326,8 @@ impl DeckData {
.map(|w| state_locked.dictionary.get(*w).unwrap())
.cloned()
.collect();
let word_ids = last_list.iter().map(|l| l.id).collect::<Vec<u32>>();
let word_ids = last_list.iter().map(|l| l.id).collect::<Vec<Id>>();
let mut index = 0;
for stat in current_set.clone() {
if !word_ids.contains(&stat.word_id) {
@@ -410,7 +416,7 @@ impl DeckData {
self.settings.id,
HistoryItem {
timestamp: Utc::now(),
word_id: word.word_id,
word_id: word.word_id.into(),
mode: WordOpenMode::Easy,
before: old_score,
after: new_score,
@@ -606,7 +612,7 @@ impl WorstWordsSRSModule {
#[derive(Clone)]
pub struct DeckSettings {
pub id: u32,
pub id: Id,
pub name: String,
pub forward: String,
pub backward: String,
@@ -619,7 +625,7 @@ pub struct DeckSettings {
impl DeckSettings {
pub(crate) fn with_name(name: String) -> DeckSettings {
DeckSettings {
id: 0,
id: 0.into(),
name,
forward: "".to_string(),
backward: "".to_string(),
@@ -661,7 +667,7 @@ impl DeckSettings {
}
let mut scope = Scope::new();
scope
.push_constant("id", word.id)
.push_constant("id", word.id.0)
.push_constant("key", word.key.clone())
.push_constant("value", word.value.clone())
.push_constant("tags", word.tags.clone())
@@ -691,3 +697,41 @@ impl DeckSettings {
self.forward == "speech" || self.backward == "speech"
}
}
impl Into<Id> for u32{
fn into(self) -> Id {
Id(self)
}
}
// impl From<u32> for Id{
// fn from(id: u32) -> Id{
// Id(id)
// }
// }
impl Into<u32> for Id{
fn into(self) -> u32 {
self.0
}
}
impl Display for Id {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl FromSql for Id{
fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
match value {
ValueRef::Integer(i) => Ok(Id(i as u32)),
_ => Err(FromSqlError::InvalidType),
}
}
}
impl ToSql for Id{
fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
Ok(ToSqlOutput::from(self.0 as i64))
}
}