diff --git a/src/data_provider/card_stats.rs b/src/data_provider/card_stats.rs index 728eec3..19efeb4 100644 --- a/src/data_provider/card_stats.rs +++ b/src/data_provider/card_stats.rs @@ -93,7 +93,7 @@ pub fn delete_stats(stat: &[CardStatistics], connection: &Connection) { .join(", "); connection .execute( - format!("DELETE FROM card_stats WHERE id in {ids}").as_str(), + format!("DELETE FROM card_stats WHERE id in ({ids})").as_str(), (), ) .unwrap(); diff --git a/src/data_provider/history.rs b/src/data_provider/history.rs index d05f485..e4e253b 100644 --- a/src/data_provider/history.rs +++ b/src/data_provider/history.rs @@ -39,7 +39,7 @@ fn parse_history_items(strings: Vec) -> Vec { continue; } items.push(HistoryItem { - timestamp: DateTime::from_timestamp(time.parse().unwrap_or_default(), 0).unwrap(), + 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, diff --git a/src/data_provider/web_api.rs b/src/data_provider/web_api.rs index 2c07ad1..5640474 100644 --- a/src/data_provider/web_api.rs +++ b/src/data_provider/web_api.rs @@ -7,10 +7,10 @@ use zstd::{DEFAULT_COMPRESSION_LEVEL, Decoder, Encoder}; // const API_URL: &str = "http://127.0.0.1:8089/"; const API_URL: &str = "https://learning.micialware.ru/"; -pub async fn send_data(id: String) { +pub async fn send_data(id: String) -> Result<(), ()> { let path = app_data_dir(); let db_file = path.join("data.db"); - let data = tokio::fs::read(db_file).await.unwrap(); + let data = tokio::fs::read(db_file).await.map_err(|_| ())?; let data = compress(data); let api_url = API_URL.to_string(); @@ -21,12 +21,11 @@ pub async fn send_data(id: String) { .post(&id_url) .body(data) .send() - .await - .unwrap() + .await.map_err(|_| ())? .text() - .await - .unwrap(); + .await.map_err(|_| ())?; set_local_version(new_version.parse::().unwrap()).await; + Ok(()) } fn compress(data: Vec) -> Vec { @@ -35,18 +34,16 @@ fn compress(data: Vec) -> Vec { encoder.finish().unwrap() } -pub async fn load_data(id: String, temp: bool) { +pub async fn load_data(id: String, temp: bool) -> Result<(), ()> { let api_url = API_URL.to_string(); let id_url = format!("{api_url}download/{id}"); let client = reqwest::Client::new(); let data = client .get(&id_url) .send() - .await - .unwrap() + .await.map_err(|_| ())? .bytes() - .await - .unwrap() + .await.map_err(|_| ())? .to_vec(); let data = decompress(data); @@ -54,18 +51,17 @@ pub async fn load_data(id: String, temp: bool) { let file_name = if temp { "data.db.tmp" } else { "data.db" }; let db_file = path.join(file_name); - tokio::fs::write(db_file, data).await.unwrap(); + tokio::fs::write(db_file, data).await.map_err(|_| ())?; let version_url = format!("{API_URL}{id}/version"); let version = client .get(&version_url) .send() - .await - .unwrap() + .await.map_err(|_| ())? .text() - .await - .unwrap(); - set_local_version(version.parse::().unwrap()).await; + .await.map_err(|_| ())?; + set_local_version(version.parse::().map_err(|_| ())?).await; + Ok(()) } pub fn decompress(data: Vec) -> Vec { @@ -78,7 +74,7 @@ pub fn decompress(data: Vec) -> Vec { decompressed } -pub async fn first_sync() -> String { +pub async fn first_sync() -> Result { let id_url = API_URL.to_string() + "generate"; let client = reqwest::Client::new(); @@ -86,12 +82,12 @@ pub async fn first_sync() -> String { .get(&id_url) .send() .await - .unwrap() + .map_err(|_| ())? .text() .await - .unwrap(); + .map_err(|_| ())?; println!("id: {}", id); - id + Ok(id) } pub async fn get_web_version(key: &str) -> Result { @@ -112,7 +108,7 @@ pub async fn get_local_version() -> u32 { .read_to_string(&mut data) .await .unwrap(); - return data.parse::().unwrap(); + return data.parse::().unwrap_or_default(); } let mut file = OpenOptions::new() diff --git a/src/dictionary.rs b/src/dictionary.rs index fc3be4b..bcfe3b1 100644 --- a/src/dictionary.rs +++ b/src/dictionary.rs @@ -1,6 +1,6 @@ use crate::data_provider::words::{delete_group, delete_word, update_group, update_word}; use crate::dictionary::DictionaryMessage::*; -use crate::dictionary_test::DictionaryQuizState; +use crate::dictionary_quiz::DictionaryQuizState; use crate::import::ImportState; use crate::lang::{WordData, WordGroup}; use crate::navigation::Page::{Import, Word}; diff --git a/src/dictionary_test.rs b/src/dictionary_quiz.rs similarity index 99% rename from src/dictionary_test.rs rename to src/dictionary_quiz.rs index cf508fc..c71a740 100644 --- a/src/dictionary_test.rs +++ b/src/dictionary_quiz.rs @@ -1,6 +1,6 @@ use crate::RootMessage; use crate::dictionary::split_with_coma; -use crate::dictionary_test::DictionaryQuizMessage::*; +use crate::dictionary_quiz::DictionaryQuizMessage::*; use crate::lang::WordData; use crate::navigation::Page::PreviousPage; use crate::navigation::*; diff --git a/src/main.rs b/src/main.rs index d04e06a..204e308 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ #![windows_subsystem = "windows"] mod data_provider; mod dictionary; -mod dictionary_test; +mod dictionary_quiz; mod history; pub mod import; mod lang; diff --git a/src/navigation.rs b/src/navigation.rs index 7ef1ca7..c628b50 100644 --- a/src/navigation.rs +++ b/src/navigation.rs @@ -4,7 +4,7 @@ use crate::data_provider::web_api::{ get_local_version, get_web_version, load_data, set_local_version, }; use crate::dictionary::{DictionaryMessage, DictionaryState, app_data_dir}; -use crate::dictionary_test::{DictionaryQuizMessage, DictionaryQuizState}; +use crate::dictionary_quiz::{DictionaryQuizMessage, DictionaryQuizState}; use crate::history::{HistoryMessage, HistoryState}; use crate::import::{ImportMessage, ImportState}; use crate::lang::Id; diff --git a/src/sync.rs b/src/sync.rs index de4d134..db05690 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -4,7 +4,7 @@ use crate::navigation::Page::PreviousPage; use crate::navigation::{NavigatedPage, Page}; use crate::styling::*; use crate::sync::SyncMessage::*; -use crate::{AppState, RootMessage, fill_state}; +use crate::{fill_state, AppState, RootMessage}; use iced::widget::button::danger; use iced::widget::container::rounded_box; use iced::widget::{button, column, container, progress_bar, row, space, text, toggler}; @@ -59,7 +59,12 @@ impl NavigatedPage for SyncState { .map(|_val: String| RootMessage::Sync(KeyCopied)); } InitSync => { - return Task::perform(first_sync(), |id| RootMessage::Sync(IdReceived(id))); + return Task::perform(first_sync(), |id| { + match id { + Ok(id) => RootMessage::Sync(IdReceived(id)), + Err(_) => RootMessage::None + } + }); } GetKey => { return iced::clipboard::read() @@ -218,10 +223,10 @@ impl SyncState { ] } } - .spacing(DEFAULT_SPACING) - .align_x(Center) - .width(Length::Shrink) - .into() + .spacing(DEFAULT_SPACING) + .align_x(Center) + .width(Length::Shrink) + .into() } /* fn app_updater(&self) -> Element<'_, SyncMessage> {