From b5b1eb768cc71a4684e241cd64f62794dfc5e706 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Mon, 24 Aug 2026 23:10:23 +0300 Subject: [PATCH] remove more unwrap --- src/data.rs | 2 +- src/data_provider/history.rs | 22 ++++++++++++---------- src/data_provider/import.rs | 10 +++++----- src/data_provider/settings.rs | 26 ++++++++++++++++++-------- src/data_provider/sqlite.rs | 2 +- src/pages/repetitions.rs | 2 +- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/data.rs b/src/data.rs index f8c8120..c16091e 100644 --- a/src/data.rs +++ b/src/data.rs @@ -6,7 +6,7 @@ use std::str::FromStr; use rusqlite::ToSql; use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}; -#[derive(Clone, PartialEq, Eq, Debug, Hash, Copy, Ord, PartialOrd)] +#[derive(Clone, PartialEq, Eq, Debug, Hash, Copy, Ord, PartialOrd, Default)] pub struct Id(pub(crate) u32); pub const INVALID_ID: Id = Id(0); impl FromStr for Id { diff --git a/src/data_provider/history.rs b/src/data_provider/history.rs index ead134b..aa92149 100644 --- a/src/data_provider/history.rs +++ b/src/data_provider/history.rs @@ -1,6 +1,6 @@ use crate::core::srs::WordOpenMode; -use crate::data::entities::HistoryItem; use crate::data::Id; +use crate::data::entities::HistoryItem; use crate::fs::*; use crate::notification::NotificationData; use crate::notification::NotificationData::PermissionDenied; @@ -20,13 +20,16 @@ pub fn get_history_of_set(id: Id) -> Result, NotificationData> Ok(parse_history_items(lines)) } -fn append_lines_if_exists(path: PathBuf, lines: &mut Vec) { +fn append_lines_if_exists(path: PathBuf, lines: &mut Vec) -> Result<(), NotificationData> { if path.exists() { - let reader = BufReader::new(File::open(path).unwrap()); - for line in reader.lines() { - lines.push(line.unwrap()); - } + let reader = BufReader::new(File::open(path).map_err(|_| PermissionDenied)?); + reader + .lines() + .map_while(Result::ok) + .for_each(|i| lines.push(i)); } + Ok(()) + } fn parse_history_items(strings: Vec) -> Vec { @@ -37,12 +40,13 @@ fn parse_history_items(strings: Vec) -> Vec { if id.is_err() { continue; } - let id = id.unwrap(); + let id = id.unwrap_or_default(); if !id.is_valid() { continue; } items.push(HistoryItem { - timestamp: DateTime::from_timestamp(time.parse().unwrap_or_default(), 0).unwrap_or_default(), + timestamp: DateTime::from_timestamp(time.parse().unwrap_or_default(), 0) + .unwrap_or_default(), word_id: id, mode: match mode.parse::().unwrap_or_default() { 2 => WordOpenMode::Hard, @@ -84,5 +88,3 @@ pub fn push_note(set_id: Id, item: HistoryItem) -> Result<(), NotificationData> writeln!(&mut file, "{}", line_str).map_err(|_| PermissionDenied)?; Ok(()) } - - diff --git a/src/data_provider/import.rs b/src/data_provider/import.rs index a2116d5..b46d8a9 100644 --- a/src/data_provider/import.rs +++ b/src/data_provider/import.rs @@ -39,8 +39,8 @@ pub fn load_groups(connection: &Connection) -> Result>(); for (_, collection) in sets { @@ -54,12 +54,12 @@ pub fn load_groups(connection: &Connection) -> Result Result>()) } diff --git a/src/data_provider/settings.rs b/src/data_provider/settings.rs index ad12034..5d7a5ea 100644 --- a/src/data_provider/settings.rs +++ b/src/data_provider/settings.rs @@ -1,12 +1,13 @@ use crate::notification::NotificationData; use crate::notification::NotificationData::{DbLoadError, DbSaveError}; +use iced::futures::StreamExt; use rusqlite::Connection; pub fn get_setting(key: String, connection: &Connection) -> Option { let mut stmt = connection .prepare("SELECT value FROM settings WHERE id = ?1") - .unwrap(); - let mut iter = stmt.query_map((key,), |row| row.get(0)).unwrap(); + .expect("Failed to prepare statement."); + let mut iter = stmt.query_map((key,), |row| row.get(0)).ok()?; if let Some(row) = iter.next() && let Ok(value) = row @@ -32,13 +33,18 @@ pub fn set_setting( Ok(()) } -pub fn delete_settings(key: String, connection: &Connection) { +pub fn delete_settings(key: String, connection: &Connection) -> Result<(), NotificationData> { connection .execute("DELETE FROM settings WHERE id = ?1", (&key,)) - .unwrap(); + .map_err(|_| DbSaveError)?; + Ok(()) } -fn create_settings(key: String, value: String, connection: &Connection) -> Result<(), NotificationData>{ +fn create_settings( + key: String, + value: String, + connection: &Connection, +) -> Result<(), NotificationData> { connection .execute( "INSERT into settings (id, value) VALUES (?1, ?2)", @@ -65,7 +71,11 @@ where id = ?1", } fn get_settings_list(connection: &Connection) -> Result, NotificationData> { - let mut stmt = connection.prepare("SELECT id FROM settings").expect("prepare stmt failed"); - let iter = stmt.query_map((), |row| row.get(0)).map_err(|_| DbLoadError)?; - Ok(iter.map(|row| row.unwrap()).collect()) + let mut stmt = connection + .prepare("SELECT id FROM settings") + .expect("prepare stmt failed"); + let iter = stmt + .query_map((), |row| row.get(0)) + .map_err(|_| DbLoadError)?; + Ok(iter.filter_map(|i| i.ok()).collect()) } diff --git a/src/data_provider/sqlite.rs b/src/data_provider/sqlite.rs index 46b850c..0abf6a2 100644 --- a/src/data_provider/sqlite.rs +++ b/src/data_provider/sqlite.rs @@ -4,7 +4,7 @@ use crate::fs::*; pub fn create_db() { let db_file = db_path(); if !db_file.exists() { - std::fs::File::create(&db_file).unwrap(); + std::fs::File::create(&db_file).expect("Database file creation failed"); let connection = Connection::open(&db_file).unwrap(); connection.execute("PRAGMA foreign_keys = ON;", []).unwrap(); diff --git a/src/pages/repetitions.rs b/src/pages/repetitions.rs index 3d1be75..50b5018 100644 --- a/src/pages/repetitions.rs +++ b/src/pages/repetitions.rs @@ -450,7 +450,7 @@ impl RepetitionsState { let date = (*now) .checked_sub_days(Days::new(30 * 7 - i * 7 - j - 1)) - .unwrap(); + .unwrap_or_default(); column = column.push(tooltip( iced::widget::container(space().height(15).width(15)).style(