cfx_rpc_eth_types/
eth_pubsub.rs

1// Copyright 2019 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4
5//! Pub-Sub types.
6
7use super::{EthRpcLogFilter, Header, Log};
8use cfx_types::H256;
9use serde::{de::Error, Deserialize, Deserializer, Serialize};
10use serde_json::{from_value, Value};
11
12/// Subscription result.
13#[allow(dead_code)]
14#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
15#[serde(untagged, rename_all = "camelCase")]
16// NOTE: rename_all does not apply to enum member fields
17// see: https://github.com/serde-rs/serde/issues/1061
18pub enum Result {
19    /// New block header.
20    Header(Header),
21
22    /// Log
23    Log(Log),
24
25    /// Transaction hash
26    TransactionHash(H256),
27}
28
29/// Subscription kind.
30#[derive(Debug, Deserialize, PartialEq, Eq, Hash, Clone)]
31#[serde(deny_unknown_fields)]
32#[serde(rename_all = "camelCase")]
33pub enum Kind {
34    /// New block headers subscription.
35    NewHeads,
36    /// Logs subscription.
37    Logs,
38    /// New Pending Transactions subscription.
39    NewPendingTransactions,
40    /// Node syncing status subscription.
41    Syncing,
42}
43
44/// Subscription kind.
45#[derive(Debug, PartialEq, Eq, Hash, Clone)]
46pub enum Params {
47    /// No parameters passed.
48    None,
49    /// Log parameters.
50    Logs(EthRpcLogFilter),
51}
52
53impl Default for Params {
54    fn default() -> Self { Params::None }
55}
56
57impl<'a> Deserialize<'a> for Params {
58    fn deserialize<D>(
59        deserializer: D,
60    ) -> ::std::result::Result<Params, D::Error>
61    where D: Deserializer<'a> {
62        let v: Value = Deserialize::deserialize(deserializer)?;
63
64        if v.is_null() {
65            return Ok(Params::None);
66        }
67
68        // try to interpret as a log filter
69        from_value(v.clone()).map(Params::Logs).map_err(|e| {
70            D::Error::custom(format!("Invalid Pub-Sub parameters: {}", e))
71        })
72    }
73}