reth_snap_sync/common/
record.rs1use crate::SnapSyncError;
7use reth_storage_api::{MetadataProvider, MetadataWriter};
8use reth_storage_errors::provider::ProviderError;
9use serde::{de::DeserializeOwned, Serialize};
10
11pub(crate) trait SnapRecord: Serialize + DeserializeOwned {
15 const KEY: &'static str;
17
18 const VERSION: u32;
20
21 fn read(provider: &impl MetadataProvider) -> Result<Option<Self>, SnapSyncError> {
23 let Some(bytes) = provider.get_metadata(Self::KEY)? else { return Ok(None) };
24 let value = serde_json::from_slice::<serde_json::Value>(&bytes)
25 .map_err(|source| SnapSyncError::UnreadableRecord { key: Self::KEY, source })?;
26 let version = value.get("version").and_then(serde_json::Value::as_u64);
27 if version != Some(u64::from(Self::VERSION)) {
28 return Err(SnapSyncError::UnsupportedRecord { key: Self::KEY, version })
29 }
30 serde_json::from_value(value)
31 .map(Some)
32 .map_err(|source| SnapSyncError::UnreadableRecord { key: Self::KEY, source })
33 }
34
35 fn clear(provider: &impl MetadataWriter) -> Result<(), SnapSyncError> {
37 provider.delete_metadata(Self::KEY)?;
38 Ok(())
39 }
40
41 fn write(&self, provider: &impl MetadataWriter) -> Result<(), SnapSyncError> {
43 provider
44 .write_metadata(Self::KEY, serde_json::to_vec(self).map_err(ProviderError::other)?)?;
45 Ok(())
46 }
47}