reth_storage_api/
metadata.rs1use alloc::vec::Vec;
4use reth_db_api::models::{SnapAttempt, StorageSettings, SNAP_ATTEMPT_VERSION};
5use reth_storage_errors::provider::{ProviderError, ProviderResult};
6
7pub mod keys {
9 pub const STORAGE_SETTINGS: &str = "storage_settings";
11
12 pub const SNAP_ATTEMPT: &str = "snap_attempt";
14}
15
16#[auto_impl::auto_impl(&, Arc)]
18pub trait MetadataProvider: Send {
19 fn get_metadata(&self, key: &str) -> ProviderResult<Option<Vec<u8>>>;
21
22 fn storage_settings(&self) -> ProviderResult<Option<StorageSettings>> {
28 Ok(self
29 .get_metadata(keys::STORAGE_SETTINGS)?
30 .and_then(|bytes| serde_json::from_slice(&bytes).ok()))
31 }
32
33 fn snap_attempt(&self) -> ProviderResult<Option<SnapAttempt>> {
38 let Some(bytes) = self.get_metadata(keys::SNAP_ATTEMPT)? else { return Ok(None) };
39
40 let value: serde_json::Value =
43 serde_json::from_slice(&bytes).map_err(ProviderError::other)?;
44 let found = value.get("version").and_then(serde_json::Value::as_u64);
45 if found != Some(SNAP_ATTEMPT_VERSION as u64) {
46 return Err(ProviderError::UnsupportedSnapAttemptVersion {
47 found,
48 supported: SNAP_ATTEMPT_VERSION,
49 })
50 }
51
52 serde_json::from_slice(&bytes).map(Some).map_err(ProviderError::other)
53 }
54}
55
56pub trait MetadataWriter: Send {
58 fn write_metadata(&self, key: &str, value: Vec<u8>) -> ProviderResult<()>;
60
61 fn delete_metadata(&self, _key: &str) -> ProviderResult<()> {
63 Err(ProviderError::UnsupportedProvider)
64 }
65
66 fn write_storage_settings(&self, settings: StorageSettings) -> ProviderResult<()> {
71 self.write_metadata(
72 keys::STORAGE_SETTINGS,
73 serde_json::to_vec(&settings).map_err(ProviderError::other)?,
74 )
75 }
76
77 fn write_snap_attempt(&self, attempt: &SnapAttempt) -> ProviderResult<()> {
79 self.write_metadata(
80 keys::SNAP_ATTEMPT,
81 serde_json::to_vec(attempt).map_err(ProviderError::other)?,
82 )
83 }
84}
85
86pub trait StorageSettingsCache: Send {
88 fn cached_storage_settings(&self) -> StorageSettings;
90
91 fn set_storage_settings_cache(&self, settings: StorageSettings);
96}
97
98#[cfg(feature = "std")]
100pub trait StoragePath: Send {
101 fn storage_path(&self) -> std::path::PathBuf;
103}