1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::collections::BTreeMap;

use super::{BitcoinBlockData, BitcoinTransactionData, StacksBlockData, StacksTransactionData};
use serde_json::Value as JsonValue;

pub struct ProcessedStacksTransaction {
    pub tx: StacksTransactionData,
    pub metadata: BTreeMap<String, JsonValue>,
}

pub struct ProcessedStacksBlock {
    pub tx: StacksBlockData,
    pub metadata: BTreeMap<String, JsonValue>,
}

pub struct ProcessedBitcoinTransaction {
    pub tx: BitcoinTransactionData,
    pub metadata: BTreeMap<String, JsonValue>,
}

pub struct ProcessedBitcoinBlock {
    pub tx: BitcoinBlockData,
    pub metadata: BTreeMap<String, JsonValue>,
}

pub enum ProcessingContext {
    Scanning,
    Streaming,
}

pub trait BitcoinProtocolProcessor {
    fn register(&mut self);
    fn process_block(
        &mut self,
        block: &mut ProcessedBitcoinBlock,
        processing_context: ProcessingContext,
    );
    fn process_transaction(
        &mut self,
        transaction: &mut ProcessedBitcoinTransaction,
        processing_context: ProcessingContext,
    );
}

pub fn run_processor<P>(mut p: P)
where
    P: BitcoinProtocolProcessor,
{
    p.register();
}