1use eyre::Result;
2use serde_json::Value as JsonValue;
3use tokio::sync::{
4 broadcast,
5 mpsc::{self, Sender},
6};
7
8use barreleye_common::{chain::WarehouseData, models::ConfigKey};
9pub use indexer::Indexer;
10pub use lists::Lists;
11
12mod indexer;
13mod lists;
14
15pub struct Pipe {
16 config_key: ConfigKey,
17 sender: Sender<(ConfigKey, JsonValue, WarehouseData)>,
18 receipt: mpsc::Receiver<()>,
19 pub abort: broadcast::Receiver<()>,
20}
21
22impl Pipe {
23 pub fn new(
24 config_key: ConfigKey,
25 sender: Sender<(ConfigKey, JsonValue, WarehouseData)>,
26 receipt: mpsc::Receiver<()>,
27 abort: broadcast::Receiver<()>,
28 ) -> Self {
29 Self { config_key, sender, receipt, abort }
30 }
31
32 pub async fn push(
33 &mut self,
34 config_value: JsonValue,
35 warehouse_data: WarehouseData,
36 ) -> Result<()> {
37 self.sender.send((self.config_key, config_value, warehouse_data)).await?;
38
39 tokio::select! {
40 _ = self.receipt.recv() => {}
41 _ = self.abort.recv() => {}
42 }
43
44 Ok(())
45 }
46}