fc_rpc_v2_types/
pubsub.rs1use ethereum_types::H256;
20use serde::{de, Deserialize, Serialize};
21
22use crate::{block::Header, filter::Filter, log::Log, transaction::Transaction};
23
24#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub enum PubSubKind {
28 NewHeads,
30 Logs,
32 NewPendingTransactions,
34}
35
36#[derive(Clone, Debug, Eq, PartialEq, Default)]
38pub enum PubSubParams {
39 #[default]
41 None,
42 Logs(Box<Filter>),
44 Bool(bool),
46}
47
48impl serde::Serialize for PubSubParams {
49 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50 where
51 S: serde::Serializer,
52 {
53 match self {
54 Self::None => serializer.serialize_none(),
55 Self::Logs(logs) => logs.serialize(serializer),
56 Self::Bool(full) => full.serialize(serializer),
57 }
58 }
59}
60
61impl<'de> serde::Deserialize<'de> for PubSubParams {
62 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
63 where
64 D: serde::Deserializer<'de>,
65 {
66 let v = serde_json::Value::deserialize(deserializer)?;
67
68 if v.is_null() {
69 return Ok(Self::None);
70 }
71
72 if let Some(val) = v.as_bool() {
73 return Ok(Self::Bool(val));
74 }
75
76 serde_json::from_value(v)
77 .map(|f| Self::Logs(Box::new(f)))
78 .map_err(|e| de::Error::custom(format!("Invalid Pub-Sub parameters: {e}")))
79 }
80}
81
82#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
84#[serde(untagged)]
85pub enum PubSubResult {
86 Header(Box<Header>),
88 Log(Box<Log>),
90 TransactionHash(H256),
92 FullTransaction(Box<Transaction>),
94}
95
96#[cfg(test)]
97mod tests {
98 use super::*;
99
100 #[test]
101 fn pubsub_params_serde_impl() {
102 let cases = [
103 ("null", PubSubParams::None),
104 ("true", PubSubParams::Bool(true)),
105 ("false", PubSubParams::Bool(false)),
106 ];
107 for (raw, typed) in cases {
108 let deserialized = serde_json::from_str::<PubSubParams>(raw).unwrap();
109 assert_eq!(deserialized, typed);
110
111 let serialized = serde_json::to_string(&typed).unwrap();
112 assert_eq!(serialized, raw);
113 }
114 }
115}