reth_prune/segments/
set.rs1use crate::segments::{
2 AccountHistory, Bodies, MerkleChangeSets, 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, StaticFileProviderFactory,
11};
12use reth_prune_types::PruneModes;
13
14#[derive(Debug)]
16pub struct SegmentSet<Provider> {
17 inner: Vec<Box<dyn Segment<Provider>>>,
18}
19
20impl<Provider> SegmentSet<Provider> {
21 pub fn new() -> Self {
23 Self::default()
24 }
25
26 pub fn segment<S: Segment<Provider> + 'static>(mut self, segment: S) -> Self {
28 self.inner.push(Box::new(segment));
29 self
30 }
31
32 pub fn segment_opt<S: Segment<Provider> + 'static>(self, segment: Option<S>) -> Self {
34 if let Some(segment) = segment {
35 return self.segment(segment)
36 }
37 self
38 }
39
40 pub fn into_vec(self) -> Vec<Box<dyn Segment<Provider>>> {
42 self.inner
43 }
44}
45
46impl<Provider> SegmentSet<Provider>
47where
48 Provider: StaticFileProviderFactory<
49 Primitives: NodePrimitives<SignedTx: Value, Receipt: Value, BlockHeader: Value>,
50 > + DBProvider<Tx: DbTxMut>
51 + PruneCheckpointWriter
52 + PruneCheckpointReader
53 + BlockReader<Transaction: Encodable2718>
54 + ChainStateBlockReader,
55{
56 pub fn from_components(
59 _static_file_provider: StaticFileProvider<Provider::Primitives>,
60 prune_modes: PruneModes,
61 ) -> Self {
62 #[expect(deprecated)]
63 let PruneModes {
64 sender_recovery,
65 transaction_lookup,
66 receipts,
67 account_history,
68 storage_history,
69 bodies_history,
70 merkle_changesets,
71 receipts_log_filter: (),
72 } = prune_modes;
73
74 Self::default()
75 .segment_opt(bodies_history.map(Bodies::new))
77 .segment(MerkleChangeSets::new(merkle_changesets))
79 .segment_opt(account_history.map(AccountHistory::new))
81 .segment_opt(storage_history.map(StorageHistory::new))
83 .segment_opt(receipts.map(UserReceipts::new))
85 .segment_opt(transaction_lookup.map(TransactionLookup::new))
87 .segment_opt(sender_recovery.map(SenderRecovery::new))
89 }
90}
91
92impl<Provider> Default for SegmentSet<Provider> {
93 fn default() -> Self {
94 Self { inner: Vec::new() }
95 }
96}