-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmod.rs
More file actions
110 lines (96 loc) · 3.31 KB
/
mod.rs
File metadata and controls
110 lines (96 loc) · 3.31 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::plan::Plan;
use crate::primitives::BlockNumber;
use serde::{Deserialize, Serialize};
pub mod eth;
pub mod solana;
pub mod substrate;
pub mod starknet;
pub mod fuel;
mod util;
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Query {
#[serde(rename = "eth")]
Eth(eth::EthQuery),
#[serde(rename = "solana")]
Solana(solana::SolanaQuery),
#[serde(rename = "substrate")]
Substrate(substrate::SubstrateQuery),
#[serde(rename = "starknet")]
Starknet(starknet::StarknetQuery),
#[serde(rename = "fuel")]
Fuel(fuel::FuelQuery)
}
impl Query {
pub fn from_json_bytes(bytes: &[u8]) -> anyhow::Result<Self> {
let json: serde_json::Value = serde_json::from_slice(bytes)?;
Self::from_json_value(json)
}
pub fn from_json_value(mut json: serde_json::Value) -> anyhow::Result<Self> {
if let Some(m) = json.as_object_mut() {
if !m.contains_key("type") {
m.insert("type".to_string(), serde_json::Value::String("eth".to_string()));
}
}
let query: Self = serde_json::from_value(json)?;
query.validate()?;
Ok(query)
}
pub fn to_json_string(&self) -> String {
serde_json::to_string(self).unwrap()
}
pub fn validate(&self) -> anyhow::Result<()> {
match self {
Query::Eth(q) => q.validate(),
Query::Solana(q) => q.validate(),
Query::Substrate(q) => q.validate(),
Query::Starknet(q) => q.validate(),
Query::Fuel(q) => q.validate(),
}
}
pub fn first_block(&self) -> Option<BlockNumber> {
match self {
Query::Eth(q) => q.from_block,
Query::Solana(q) => q.from_block,
Query::Substrate(q) => q.from_block,
Query::Starknet(q) => q.from_block,
Query::Fuel(q) => q.from_block,
}
}
pub fn set_first_block(&mut self, block_number: Option<BlockNumber>) {
match self {
Query::Eth(q) => q.from_block = block_number,
Query::Solana(q) => q.from_block = block_number,
Query::Substrate(q) => q.from_block = block_number,
Query::Starknet(q) => q.from_block = block_number,
Query::Fuel(q) => q.from_block = block_number,
}
}
pub fn last_block(&self) -> Option<BlockNumber> {
match self {
Query::Eth(q) => q.to_block,
Query::Solana(q) => q.to_block,
Query::Substrate(q) => q.to_block,
Query::Starknet(q) => q.to_block,
Query::Fuel(q) => q.to_block,
}
}
pub fn set_last_block(&mut self, block_number: Option<BlockNumber>) {
match self {
Query::Eth(q) => q.to_block = block_number,
Query::Solana(q) => q.to_block = block_number,
Query::Substrate(q) => q.to_block = block_number,
Query::Starknet(q) => q.to_block = block_number,
Query::Fuel(q) => q.to_block = block_number,
}
}
pub fn compile(&self) -> Plan {
match self {
Query::Eth(q) => q.compile(),
Query::Solana(q) => q.compile(),
Query::Substrate(q) => q.compile(),
Query::Starknet(q) => q.compile(),
Query::Fuel(q) => q.compile(),
}
}
}