reth_prune/segments/
set.rsuse crate::segments::{
AccountHistory, ReceiptsByLogs, Segment, SenderRecovery, StorageHistory, TransactionLookup,
UserReceipts,
};
use alloy_eips::eip2718::Encodable2718;
use reth_db::{table::Value, transaction::DbTxMut};
use reth_primitives_traits::NodePrimitives;
use reth_provider::{
providers::StaticFileProvider, BlockReader, DBProvider, PruneCheckpointWriter,
StaticFileProviderFactory,
};
use reth_prune_types::PruneModes;
use super::{StaticFileHeaders, StaticFileReceipts, StaticFileTransactions};
#[derive(Debug)]
pub struct SegmentSet<Provider> {
inner: Vec<Box<dyn Segment<Provider>>>,
}
impl<Provider> SegmentSet<Provider> {
pub fn new() -> Self {
Self::default()
}
pub fn segment<S: Segment<Provider> + 'static>(mut self, segment: S) -> Self {
self.inner.push(Box::new(segment));
self
}
pub fn segment_opt<S: Segment<Provider> + 'static>(self, segment: Option<S>) -> Self {
if let Some(segment) = segment {
return self.segment(segment)
}
self
}
pub fn into_vec(self) -> Vec<Box<dyn Segment<Provider>>> {
self.inner
}
}
impl<Provider> SegmentSet<Provider>
where
Provider: StaticFileProviderFactory<Primitives: NodePrimitives<SignedTx: Value, Receipt: Value>>
+ DBProvider<Tx: DbTxMut>
+ PruneCheckpointWriter
+ BlockReader<Transaction: Encodable2718>,
{
pub fn from_components(
static_file_provider: StaticFileProvider<Provider::Primitives>,
prune_modes: PruneModes,
) -> Self {
let PruneModes {
sender_recovery,
transaction_lookup,
receipts,
account_history,
storage_history,
receipts_log_filter,
} = prune_modes;
Self::default()
.segment(StaticFileHeaders::new(static_file_provider.clone()))
.segment(StaticFileTransactions::new(static_file_provider.clone()))
.segment(StaticFileReceipts::new(static_file_provider))
.segment_opt(account_history.map(AccountHistory::new))
.segment_opt(storage_history.map(StorageHistory::new))
.segment_opt(receipts.map(UserReceipts::new))
.segment_opt(
(!receipts_log_filter.is_empty())
.then(|| ReceiptsByLogs::new(receipts_log_filter.clone())),
)
.segment_opt(transaction_lookup.map(TransactionLookup::new))
.segment_opt(sender_recovery.map(SenderRecovery::new))
}
}
impl<Provider> Default for SegmentSet<Provider> {
fn default() -> Self {
Self { inner: Vec::new() }
}
}