reth_storage_api/metadata.rs
1//! Metadata provider trait for reading and writing node metadata.
2
3use alloc::vec::Vec;
4use reth_db_api::models::StorageSettings;
5use reth_storage_errors::provider::{ProviderError, ProviderResult};
6
7/// Metadata keys.
8pub mod keys {
9 /// Storage configuration settings for this node.
10 pub const STORAGE_SETTINGS: &str = "storage_settings";
11}
12
13/// Client trait for reading node metadata from the database.
14#[auto_impl::auto_impl(&)]
15pub trait MetadataProvider: Send {
16 /// Get a metadata value by key
17 fn get_metadata(&self, key: &str) -> ProviderResult<Option<Vec<u8>>>;
18
19 /// Get storage settings for this node
20 fn storage_settings(&self) -> ProviderResult<Option<StorageSettings>> {
21 self.get_metadata(keys::STORAGE_SETTINGS)?
22 .map(|bytes| serde_json::from_slice(&bytes).map_err(ProviderError::other))
23 .transpose()
24 }
25}
26
27/// Client trait for writing node metadata to the database.
28pub trait MetadataWriter: Send {
29 /// Write a metadata value
30 fn write_metadata(&self, key: &str, value: Vec<u8>) -> ProviderResult<()>;
31
32 /// Write storage settings for this node
33 ///
34 /// Be sure to update provider factory cache with
35 /// [`StorageSettingsCache::set_storage_settings_cache`].
36 fn write_storage_settings(&self, settings: StorageSettings) -> ProviderResult<()> {
37 self.write_metadata(
38 keys::STORAGE_SETTINGS,
39 serde_json::to_vec(&settings).map_err(ProviderError::other)?,
40 )
41 }
42}
43
44/// Trait for caching storage settings on a provider factory.
45pub trait StorageSettingsCache: Send {
46 /// Gets the cached storage settings.
47 fn cached_storage_settings(&self) -> StorageSettings;
48
49 /// Sets the storage settings of this `ProviderFactory`.
50 ///
51 /// IMPORTANT: It does not save settings in storage, that should be done by
52 /// [`MetadataWriter::write_storage_settings`]
53 fn set_storage_settings_cache(&self, settings: StorageSettings);
54}