reth_prune/segments/
set.rs
1use crate::segments::{
2 AccountHistory, ReceiptsByLogs, Segment, SenderRecovery, StorageHistory, TransactionLookup,
3 UserReceipts,
4};
5use alloy_eips::eip2718::Encodable2718;
6use reth_db_api::{table::Value, transaction::DbTxMut};
7use reth_primitives_traits::NodePrimitives;
8use reth_provider::{
9 providers::StaticFileProvider, BlockReader, DBProvider, PruneCheckpointWriter,
10 StaticFileProviderFactory,
11};
12use reth_prune_types::PruneModes;
13
14use super::{StaticFileHeaders, StaticFileReceipts, StaticFileTransactions};
15
16#[derive(Debug)]
18pub struct SegmentSet<Provider> {
19 inner: Vec<Box<dyn Segment<Provider>>>,
20}
21
22impl<Provider> SegmentSet<Provider> {
23 pub fn new() -> Self {
25 Self::default()
26 }
27
28 pub fn segment<S: Segment<Provider> + 'static>(mut self, segment: S) -> Self {
30 self.inner.push(Box::new(segment));
31 self
32 }
33
34 pub fn segment_opt<S: Segment<Provider> + 'static>(self, segment: Option<S>) -> Self {
36 if let Some(segment) = segment {
37 return self.segment(segment)
38 }
39 self
40 }
41
42 pub fn into_vec(self) -> Vec<Box<dyn Segment<Provider>>> {
44 self.inner
45 }
46}
47
48impl<Provider> SegmentSet<Provider>
49where
50 Provider: StaticFileProviderFactory<Primitives: NodePrimitives<SignedTx: Value, Receipt: Value>>
51 + DBProvider<Tx: DbTxMut>
52 + PruneCheckpointWriter
53 + BlockReader<Transaction: Encodable2718>,
54{
55 pub fn from_components(
58 static_file_provider: StaticFileProvider<Provider::Primitives>,
59 prune_modes: PruneModes,
60 ) -> Self {
61 let PruneModes {
62 sender_recovery,
63 transaction_lookup,
64 receipts,
65 account_history,
66 storage_history,
67 receipts_log_filter,
68 } = prune_modes;
69
70 Self::default()
71 .segment(StaticFileHeaders::new(static_file_provider.clone()))
73 .segment(StaticFileTransactions::new(static_file_provider.clone()))
75 .segment(StaticFileReceipts::new(static_file_provider))
77 .segment_opt(account_history.map(AccountHistory::new))
79 .segment_opt(storage_history.map(StorageHistory::new))
81 .segment_opt(receipts.map(UserReceipts::new))
83 .segment_opt(
85 (!receipts_log_filter.is_empty())
86 .then(|| ReceiptsByLogs::new(receipts_log_filter.clone())),
87 )
88 .segment_opt(transaction_lookup.map(TransactionLookup::new))
90 .segment_opt(sender_recovery.map(SenderRecovery::new))
92 }
93}
94
95impl<Provider> Default for SegmentSet<Provider> {
96 fn default() -> Self {
97 Self { inner: Vec::new() }
98 }
99}