diff --git a/.changes/store-plugin-rework.md b/.changes/store-plugin-rework.md index 6a771690..2b6d3618 100644 --- a/.changes/store-plugin-rework.md +++ b/.changes/store-plugin-rework.md @@ -6,7 +6,7 @@ - Renamed `StoreCollection` to `StoreState` - `StoreBuilder::build` now returns a `Result` -- `StoreExt::store` now returns `Arc` instead of `Store` +- `StoreExt::store` now returns `Result>` Other Changes: diff --git a/plugins/store/examples/AppSettingsManager/src-tauri/src/main.rs b/plugins/store/examples/AppSettingsManager/src-tauri/src/main.rs index fbe250ae..f20db4fc 100644 --- a/plugins/store/examples/AppSettingsManager/src-tauri/src/main.rs +++ b/plugins/store/examples/AppSettingsManager/src-tauri/src/main.rs @@ -17,7 +17,7 @@ fn main() { .plugin(tauri_plugin_store::Builder::new().build()) .setup(|app| { // Init store and load it from disk - let store = app.store("settings.json"); + let store = app.store("settings.json")?; app.listen("store://change", |event| { dbg!(event); }); diff --git a/plugins/store/src/lib.rs b/plugins/store/src/lib.rs index 1edfa569..15b98d38 100644 --- a/plugins/store/src/lib.rs +++ b/plugins/store/src/lib.rs @@ -134,7 +134,7 @@ async fn create_or_existing_store( serialize_fn_name, deserialize_fn_name, )?; - let (_, rid) = builder.build_or_existing_inner(); + let (_, rid) = builder.build_or_existing_inner()?; Ok(rid) } @@ -145,7 +145,7 @@ async fn get_store( path: PathBuf, ) -> Result> { let stores = store_state.stores.lock().unwrap(); - Ok(stores.get(&resolve_store_path(&app, path)).copied()) + Ok(stores.get(&resolve_store_path(&app, path)?).copied()) } #[tauri::command] @@ -244,7 +244,7 @@ async fn save(app: AppHandle, rid: ResourceId) -> Result<()> { pub trait StoreExt { /// Create a store or get an existing store with default settings at path - fn store(&self, path: impl AsRef) -> Arc>; + fn store(&self, path: impl AsRef) -> Result>>; /// Create a store with default settings fn create_store(&self, path: impl AsRef) -> Result>>; /// Get a store builder @@ -254,7 +254,7 @@ pub trait StoreExt { } impl> StoreExt for T { - fn store(&self, path: impl AsRef) -> Arc> { + fn store(&self, path: impl AsRef) -> Result>> { StoreBuilder::new(self.app_handle(), path).build_or_existing() } @@ -270,7 +270,7 @@ impl> StoreExt for T { let collection = self.state::(); let stores = collection.stores.lock().unwrap(); stores - .get(&resolve_store_path(self.app_handle(), path.as_ref())) + .get(&resolve_store_path(self.app_handle(), path.as_ref()).ok()?) .and_then(|rid| self.resources_table().get(*rid).ok()) } } diff --git a/plugins/store/src/store.rs b/plugins/store/src/store.rs index b9122f99..ccdb8487 100644 --- a/plugins/store/src/store.rs +++ b/plugins/store/src/store.rs @@ -27,13 +27,8 @@ pub type DeserializeFn = pub(crate) fn resolve_store_path( app: &AppHandle, path: impl AsRef, -) -> PathBuf { - dunce::simplified( - &app.path() - .resolve(path, BaseDirectory::AppData) - .expect("failed to resolve app dir"), - ) - .to_path_buf() +) -> crate::Result { + Ok(dunce::simplified(&app.path().resolve(path, BaseDirectory::AppData)?).to_path_buf()) } /// Builds a [`Store`] @@ -61,13 +56,12 @@ impl StoreBuilder { /// ``` pub fn new, P: AsRef>(manager: &M, path: P) -> Self { let app = manager.app_handle().clone(); - let path = resolve_store_path(&app, path); let state = app.state::(); let serialize_fn = state.default_serialize; let deserialize_fn = state.default_deserialize; Self { app, - path, + path: path.as_ref().to_path_buf(), defaults: None, serialize_fn, deserialize_fn, @@ -217,35 +211,15 @@ impl StoreBuilder { Ok((store, rid)) } - pub(crate) fn build_or_existing_inner(mut self) -> (Arc>, ResourceId) { - let state = self.app.state::(); - let mut stores = state.stores.lock().unwrap(); - - if let Some(rid) = stores.get(&self.path) { - (self.app.resources_table().get(*rid).unwrap(), *rid) - } else { - let mut store_inner = StoreInner::new( - self.app.clone(), - self.path.clone(), - self.defaults.take(), - self.serialize_fn, - self.deserialize_fn, - ); - if self.load_on_build { - let _ = store_inner.load(); + pub(crate) fn build_or_existing_inner(self) -> crate::Result<(Arc>, ResourceId)> { + { + let state = self.app.state::(); + let stores = state.stores.lock().unwrap(); + if let Some(rid) = stores.get(&self.path) { + return Ok((self.app.resources_table().get(*rid).unwrap(), *rid)); } - - let store = Store { - auto_save: self.auto_save, - auto_save_debounce_sender: Arc::new(Mutex::new(None)), - store: Arc::new(Mutex::new(store_inner)), - }; - - let store = Arc::new(store); - let rid = self.app.resources_table().add_arc(store.clone()); - stores.insert(self.path, rid); - (store, rid) } + self.build_inner() } /// Builds the [`Store`], also see [`build_or_existing`](Self::build_or_existing). @@ -283,9 +257,9 @@ impl StoreBuilder { /// Ok(()) /// }); /// ``` - pub fn build_or_existing(self) -> Arc> { - let (store, _) = self.build_or_existing_inner(); - store + pub fn build_or_existing(self) -> crate::Result>> { + let (store, _) = self.build_or_existing_inner()?; + Ok(store) } }