Skip to main content

anvil_polkadot/
pubsub.rs

1use anvil_core::eth::subscription::SubscriptionId;
2use anvil_rpc::{request::Version, response::ResponseResult};
3use futures::{Stream, ready};
4use serde::Serialize;
5use std::{
6    pin::Pin,
7    task::{Context, Poll},
8};
9
10#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
11pub struct EthSubscriptionResponse {
12    jsonrpc: Version,
13    method: &'static str,
14    params: EthSubscriptionParams,
15}
16
17impl EthSubscriptionResponse {
18    pub fn new(params: EthSubscriptionParams) -> Self {
19        Self { jsonrpc: Version::V2, method: "eth_subscription", params }
20    }
21}
22
23/// Represents the `params` field of an `eth_subscription` event
24#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
25pub struct EthSubscriptionParams {
26    subscription: SubscriptionId,
27    #[serde(flatten)]
28    result: ResponseResult,
29}
30
31/// Represents an ethereum Websocket subscription
32#[derive(Debug)]
33pub enum EthSubscription {
34    // Unimplemented
35}
36
37impl EthSubscription {
38    fn poll_response(&mut self, _cx: &mut Context<'_>) -> Poll<Option<EthSubscriptionResponse>> {
39        // Unimplemented
40        Poll::Pending
41    }
42}
43
44impl Stream for EthSubscription {
45    type Item = serde_json::Value;
46
47    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
48        let pin = self.get_mut();
49        match ready!(pin.poll_response(cx)) {
50            None => Poll::Ready(None),
51            Some(res) => Poll::Ready(Some(serde_json::to_value(res).expect("can't fail;"))),
52        }
53    }
54}