fc_rpc_core/types/
pubsub.rs1use ethereum_types::H256;
22use serde::{Deserialize, Deserializer, Serialize, Serializer};
23use serde::de::Error;
24use serde_json::{Value, from_value};
25use crate::types::{RichHeader, Filter, Log};
26
27#[derive(Debug, Clone, PartialEq, Eq)]
29pub enum Result {
30 Header(Box<RichHeader>),
32 Log(Box<Log>),
34 TransactionHash(H256),
36 SyncState(PubSubSyncStatus)
38}
39
40#[derive(Debug, Serialize, Eq, PartialEq, Clone)]
42#[serde(rename_all="camelCase")]
43pub struct PubSubSyncStatus {
44 pub syncing: bool,
46}
47
48impl Serialize for Result {
49 fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
50 where S: Serializer
51 {
52 match *self {
53 Result::Header(ref header) => header.serialize(serializer),
54 Result::Log(ref log) => log.serialize(serializer),
55 Result::TransactionHash(ref hash) => hash.serialize(serializer),
56 Result::SyncState(ref sync) => sync.serialize(serializer),
57 }
58 }
59}
60
61#[derive(Debug, Deserialize, PartialEq, Eq, Hash, Clone)]
63#[serde(deny_unknown_fields)]
64#[serde(rename_all = "camelCase")]
65pub enum Kind {
66 NewHeads,
68 Logs,
70 NewPendingTransactions,
72 Syncing,
74}
75
76#[derive(Debug, PartialEq, Eq, Hash, Clone)]
78pub enum Params {
79 None,
81 Logs(Filter),
83}
84
85impl Default for Params {
86 fn default() -> Self {
87 Params::None
88 }
89}
90
91impl<'a> Deserialize<'a> for Params {
92 fn deserialize<D>(deserializer: D) -> ::std::result::Result<Params, D::Error>
93 where D: Deserializer<'a> {
94 let v: Value = Deserialize::deserialize(deserializer)?;
95
96 if v.is_null() {
97 return Ok(Params::None);
98 }
99
100 from_value(v.clone()).map(Params::Logs)
101 .map_err(|e| D::Error::custom(format!("Invalid Pub-Sub parameters: {}", e)))
102 }
103}