reth_prune/segments/
set.rs1use crate::segments::{
2 user::ReceiptsByLogs, AccountHistory, Bodies, Segment, SenderRecovery, StorageHistory,
3 TransactionLookup, 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, ChainStateBlockReader, DBProvider,
10 PruneCheckpointReader, PruneCheckpointWriter, RocksDBProviderFactory,
11 StaticFileProviderFactory,
12};
13use reth_prune_types::PruneModes;
14use reth_storage_api::{ChangeSetReader, StorageChangeSetReader, StorageSettingsCache};
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<
51 Primitives: NodePrimitives<SignedTx: Value, Receipt: Value, BlockHeader: Value>,
52 > + DBProvider<Tx: DbTxMut>
53 + PruneCheckpointWriter
54 + PruneCheckpointReader
55 + BlockReader<Transaction: Encodable2718>
56 + ChainStateBlockReader
57 + StorageSettingsCache
58 + ChangeSetReader
59 + StorageChangeSetReader
60 + RocksDBProviderFactory,
61{
62 pub fn from_components(
65 _static_file_provider: StaticFileProvider<Provider::Primitives>,
66 prune_modes: PruneModes,
67 ) -> Self {
68 let PruneModes {
69 sender_recovery,
70 transaction_lookup,
71 receipts,
72 account_history,
73 storage_history,
74 bodies_history,
75 receipts_log_filter,
76 } = prune_modes;
77
78 Self::default()
79 .segment_opt(transaction_lookup.map(TransactionLookup::new))
82 .segment_opt(bodies_history.map(|mode| Bodies::new(mode, transaction_lookup)))
84 .segment_opt(account_history.map(AccountHistory::new))
86 .segment_opt(storage_history.map(StorageHistory::new))
88 .segment_opt(receipts.map(UserReceipts::new))
90 .segment_opt(
92 (!receipts_log_filter.is_empty())
93 .then(|| ReceiptsByLogs::new(receipts_log_filter.clone())),
94 )
95 .segment_opt(sender_recovery.map(SenderRecovery::new))
97 }
98}
99
100impl<Provider> Default for SegmentSet<Provider> {
101 fn default() -> Self {
102 Self { inner: Vec::new() }
103 }
104}