diff --git a/src-tauri/yaak-git/src/error.rs b/src-tauri/yaak-git/src/error.rs index 9651601e..b4207c22 100644 --- a/src-tauri/yaak-git/src/error.rs +++ b/src-tauri/yaak-git/src/error.rs @@ -15,7 +15,7 @@ pub enum Error { #[error("Yaml error: {0}")] YamlParseError(#[from] serde_yaml::Error), - #[error("Yaml error: {0}")] + #[error(transparent)] ModelError(#[from] yaak_models::error::Error), #[error("Sync error: {0}")] @@ -24,10 +24,10 @@ pub enum Error { #[error("I/o error: {0}")] IoError(#[from] io::Error), - #[error("Yaml error: {0}")] + #[error("JSON error: {0}")] JsonParseError(#[from] serde_json::Error), - #[error("Yaml error: {0}")] + #[error("UTF8 error: {0}")] Utf8ConversionError(#[from] FromUtf8Error), #[error("Git error: {0}")] diff --git a/src-tauri/yaak-models/src/db_context.rs b/src-tauri/yaak-models/src/db_context.rs index 04bb2552..4aee86d6 100644 --- a/src-tauri/yaak-models/src/db_context.rs +++ b/src-tauri/yaak-models/src/db_context.rs @@ -2,13 +2,14 @@ use crate::connection_or_tx::ConnectionOrTx; use crate::error::Error::DBRowNotFound; use crate::models::{AnyModel, UpsertModelInfo}; use crate::util::{ModelChangeEvent, ModelPayload, UpdateSource}; +use log::error; use rusqlite::OptionalExtension; use sea_query::{ Asterisk, Expr, IntoColumnRef, IntoIden, IntoTableRef, OnConflict, Query, SimpleExpr, SqliteQueryBuilder, }; use sea_query_rusqlite::RusqliteBinder; -use tokio::sync::mpsc; +use std::sync::mpsc; pub struct DbContext<'a> { pub(crate) events_tx: mpsc::Sender, @@ -150,16 +151,15 @@ impl<'a> DbContext<'a> { update_source: source.clone(), change: ModelChangeEvent::Upsert, }; - self.events_tx.try_send(payload).unwrap(); + + if let Err(e) = self.events_tx.send(payload.clone()) { + error!("Failed to send model change {source:?}: {e:?}"); + } Ok(m) } - pub(crate) fn delete<'s, M>( - &self, - m: &M, - update_source: &UpdateSource, - ) -> crate::error::Result + pub(crate) fn delete<'s, M>(&self, m: &M, source: &UpdateSource) -> crate::error::Result where M: Into + Clone + UpsertModelInfo, { @@ -171,11 +171,13 @@ impl<'a> DbContext<'a> { let payload = ModelPayload { model: m.clone().into(), - update_source: update_source.clone(), + update_source: source.clone(), change: ModelChangeEvent::Delete, }; - self.events_tx.try_send(payload).unwrap(); + if let Err(e) = self.events_tx.send(payload) { + error!("Failed to send model change {source:?}: {e:?}"); + } Ok(m.clone()) } } diff --git a/src-tauri/yaak-models/src/lib.rs b/src-tauri/yaak-models/src/lib.rs index 061aaa72..6d8044a4 100644 --- a/src-tauri/yaak-models/src/lib.rs +++ b/src-tauri/yaak-models/src/lib.rs @@ -6,12 +6,12 @@ use log::error; use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; use std::fs::create_dir_all; +use std::sync::mpsc; use std::time::Duration; use tauri::async_runtime::Mutex; use tauri::plugin::TauriPlugin; use tauri::{Emitter, Manager, Runtime, generate_handler}; use tauri_plugin_dialog::{DialogExt, MessageDialogKind}; -use tokio::sync::mpsc; mod commands; @@ -72,11 +72,11 @@ pub fn init() -> TauriPlugin { app_handle.manage(SqliteConnection::new(pool.clone())); { - let (tx, mut rx) = mpsc::channel(128); + let (tx, rx) = mpsc::channel(); app_handle.manage(QueryManager::new(pool, tx)); let app_handle = app_handle.clone(); tauri::async_runtime::spawn(async move { - while let Some(p) = rx.recv().await { + for p in rx { let name = match p.change { ModelChangeEvent::Upsert => "upserted_model", ModelChangeEvent::Delete => "deleted_model", diff --git a/src-tauri/yaak-models/src/query_manager.rs b/src-tauri/yaak-models/src/query_manager.rs index b1f696d4..10d63933 100644 --- a/src-tauri/yaak-models/src/query_manager.rs +++ b/src-tauri/yaak-models/src/query_manager.rs @@ -6,9 +6,8 @@ use crate::util::ModelPayload; use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; use rusqlite::TransactionBehavior; -use std::sync::{Arc, Mutex}; +use std::sync::{mpsc, Arc, Mutex}; use tauri::{Manager, Runtime, State}; -use tokio::sync::mpsc; pub trait QueryManagerExt<'a, R> { fn db_manager(&'a self) -> State<'a, QueryManager>; diff --git a/src-tauri/yaak-sync/src/error.rs b/src-tauri/yaak-sync/src/error.rs index b82a9a80..978a08da 100644 --- a/src-tauri/yaak-sync/src/error.rs +++ b/src-tauri/yaak-sync/src/error.rs @@ -6,8 +6,11 @@ use thiserror::Error; pub enum Error { #[error("Yaml error: {0}")] YamlParseError(#[from] serde_yaml::Error), + + #[error("Sync parse error: {0}")] + ParseError(String), - #[error("Yaml error: {0}")] + #[error(transparent)] ModelError(#[from] yaak_models::error::Error), #[error("Unknown model: {0}")] @@ -16,7 +19,7 @@ pub enum Error { #[error("I/o error: {0}")] IoError(#[from] io::Error), - #[error("Yaml error: {0}")] + #[error("JSON error: {0}")] JsonParseError(#[from] serde_json::Error), #[error("Invalid sync file: {0}")] diff --git a/src-tauri/yaak-sync/src/models.rs b/src-tauri/yaak-sync/src/models.rs index a1dc3ffe..e7e8e074 100644 --- a/src-tauri/yaak-sync/src/models.rs +++ b/src-tauri/yaak-sync/src/models.rs @@ -1,6 +1,7 @@ use crate::error::Error::UnknownModel; use crate::error::Result; use chrono::NaiveDateTime; +use log::warn; use serde::{Deserialize, Serialize}; use sha1::{Digest, Sha1}; use std::fs; @@ -37,9 +38,21 @@ impl SyncModel { let ext = file_path.extension().unwrap_or_default(); if ext == "yml" || ext == "yaml" { - Ok(Some((serde_yaml::from_str(&content_str)?, checksum))) + Ok(match serde_yaml::from_str::(&content_str) { + Ok(m) => Some((m, checksum)), + Err(e) => { + warn!("Error parsing {:?} {:?}", file_path.file_name(), e); + None + } + }) } else if ext == "json" { - Ok(Some((serde_json::from_str(&content_str)?, checksum))) + Ok(match serde_json::from_str::(&content_str) { + Ok(m) => Some((m, checksum)), + Err(e) => { + warn!("Error parsing {:?} {:?}", file_path.file_name(), e); + None + } + }) } else { Ok(None) }