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#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
25pub struct EthSubscriptionParams {
26 subscription: SubscriptionId,
27 #[serde(flatten)]
28 result: ResponseResult,
29}
30
31#[derive(Debug)]
33pub enum EthSubscription {
34 }
36
37impl EthSubscription {
38 fn poll_response(&mut self, _cx: &mut Context<'_>) -> Poll<Option<EthSubscriptionResponse>> {
39 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}