use ethereum_types::H256;
use serde::{de, Deserialize, Serialize};
use crate::{block::Header, filter::Filter, log::Log, transaction::Transaction};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum PubSubKind {
NewHeads,
Logs,
NewPendingTransactions,
}
#[derive(Clone, Debug, Eq, PartialEq, Default)]
pub enum PubSubParams {
#[default]
None,
Logs(Box<Filter>),
Bool(bool),
}
impl serde::Serialize for PubSubParams {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self {
Self::None => serializer.serialize_none(),
Self::Logs(logs) => logs.serialize(serializer),
Self::Bool(full) => full.serialize(serializer),
}
}
}
impl<'de> serde::Deserialize<'de> for PubSubParams {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let v = serde_json::Value::deserialize(deserializer)?;
if v.is_null() {
return Ok(Self::None);
}
if let Some(val) = v.as_bool() {
return Ok(Self::Bool(val));
}
serde_json::from_value(v)
.map(|f| Self::Logs(Box::new(f)))
.map_err(|e| de::Error::custom(format!("Invalid Pub-Sub parameters: {e}")))
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PubSubResult {
Header(Box<Header>),
Log(Box<Log>),
TransactionHash(H256),
FullTransaction(Box<Transaction>),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pubsub_params_serde_impl() {
let cases = [
("null", PubSubParams::None),
("true", PubSubParams::Bool(true)),
("false", PubSubParams::Bool(false)),
];
for (raw, typed) in cases {
let deserialized = serde_json::from_str::<PubSubParams>(raw).unwrap();
assert_eq!(deserialized, typed);
let serialized = serde_json::to_string(&typed).unwrap();
assert_eq!(serialized, raw);
}
}
}