diff --git a/src/storage/codec_json.rs b/src/storage/codec_json.rs index fc065a7..a8c140f 100644 --- a/src/storage/codec_json.rs +++ b/src/storage/codec_json.rs @@ -1,6 +1,6 @@ use super::{Codec, UseStorageOptions}; -#[derive(Clone, PartialEq)] +#[derive(Clone, Default, PartialEq)] pub struct JsonCodec(); impl Codec for JsonCodec { diff --git a/src/storage/codec_prost.rs b/src/storage/codec_prost.rs index 0b0bfa7..74d1856 100644 --- a/src/storage/codec_prost.rs +++ b/src/storage/codec_prost.rs @@ -2,7 +2,7 @@ use super::{Codec, UseStorageOptions}; use base64::Engine; use thiserror::Error; -#[derive(Clone, PartialEq)] +#[derive(Clone, Default, PartialEq)] pub struct ProstCodec(); #[derive(Error, Debug, PartialEq)] diff --git a/src/storage/mod.rs b/src/storage/mod.rs index eeae93e..e5b09ed 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -4,4 +4,9 @@ mod codec_json; mod codec_prost; mod use_storage; +pub use crate::core::StorageType; +#[cfg(feature = "serde")] +pub use codec_json::*; +#[cfg(feature = "prost")] +pub use codec_prost::*; pub use use_storage::*; diff --git a/src/storage/use_storage.rs b/src/storage/use_storage.rs index d048b9c..27b1452 100644 --- a/src/storage/use_storage.rs +++ b/src/storage/use_storage.rs @@ -34,17 +34,22 @@ pub enum UseStorageError { } /// Hook for using local storage. Returns a result of a signal and a setter / deleter. -pub fn use_local_storage(key: impl AsRef) -> (Memo, impl Fn(Option) -> ()) +pub fn use_local_storage(key: impl AsRef) -> (Memo, impl Fn(Option) -> () + Clone) where - T: Clone + Default + FromStr + PartialEq + ToString, + T: Clone + Default + PartialEq, + C: Codec + Default, { - use_storage_with_options(StorageType::Local, key, UseStorageOptions::string_codec()) + use_storage_with_options( + StorageType::Local, + key, + UseStorageOptions::::default(), + ) } pub fn use_local_storage_with_options( key: impl AsRef, options: UseStorageOptions, -) -> (Memo, impl Fn(Option) -> ()) +) -> (Memo, impl Fn(Option) -> () + Clone) where T: Clone + PartialEq, C: Codec, @@ -53,17 +58,24 @@ where } /// Hook for using session storage. Returns a result of a signal and a setter / deleter. -pub fn use_session_storage(key: impl AsRef) -> (Memo, impl Fn(Option) -> ()) +pub fn use_session_storage( + key: impl AsRef, +) -> (Memo, impl Fn(Option) -> () + Clone) where - T: Clone + Default + FromStr + PartialEq + ToString, + T: Clone + Default + PartialEq, + C: Codec + Default, { - use_storage_with_options(StorageType::Session, key, UseStorageOptions::string_codec()) + use_storage_with_options( + StorageType::Session, + key, + UseStorageOptions::::default(), + ) } pub fn use_session_storage_with_options( key: impl AsRef, options: UseStorageOptions, -) -> (Memo, impl Fn(Option) -> ()) +) -> (Memo, impl Fn(Option) -> () + Clone) where T: Clone + PartialEq, C: Codec, @@ -76,7 +88,7 @@ pub fn use_storage_with_options( storage_type: StorageType, key: impl AsRef, options: UseStorageOptions, -) -> (Memo, impl Fn(Option) -> ()) +) -> (Memo, impl Fn(Option) -> () + Clone) where T: Clone + PartialEq, C: Codec, @@ -206,6 +218,17 @@ fn decode_item>( .unwrap_or_default() } +impl + Default> Default for UseStorageOptions { + fn default() -> Self { + Self { + codec: C::default(), + on_error: Rc::new(|_err| ()), + listen_to_storage_changes: true, + default_value: MaybeSignal::default(), + } + } +} + impl> UseStorageOptions { pub(super) fn new(codec: C) -> Self { Self { @@ -244,7 +267,7 @@ pub trait Codec: Clone + 'static { fn decode(&self, str: String) -> Result; } -#[derive(Clone, PartialEq)] +#[derive(Clone, Default, PartialEq)] pub struct StringCodec(); impl Codec for StringCodec {