icon_sdk/
transaction.rs

1use reqwest::{Client, StatusCode};
2use serde::{Deserialize, Serialize};
3use serde_json::{json, Value};
4
5use thiserror::Error;
6use crate::icon_service::IconService;
7
8#[derive(Default, Serialize, Deserialize)]
9pub struct Transaction {
10    icon_service_url: String,
11    pub(crate) data: Value,
12}
13
14#[derive(Error, Debug)]
15pub enum MyError {
16    #[error("request failed")]
17    Request(#[from] reqwest::Error),
18
19    #[error("unexpected response: {0}")]
20    UnexpectedResponse(String),
21}
22
23impl Transaction {
24    pub fn new(icon_service: &IconService) -> Self {
25        Self {
26            icon_service_url: format!("{}", icon_service.icon_service_url),
27            data: json!({
28                "jsonrpc": "2.0",
29                "id": 1234
30            }),
31        }
32    }
33
34    pub async fn send(self) -> Result<Value, MyError> {
35        let client = Client::new();
36        let url = self.icon_service_url;
37        let data = self.data;
38
39        let res = client.post(&url)
40            .json(&data)
41            .send()
42            .await?;
43
44        match res.status() {
45            StatusCode::OK => Ok(res.json().await?),
46            _ => {
47                let error_message = res.text().await.unwrap_or_else(|_| "Unknown error".to_string());
48                Err(MyError::UnexpectedResponse(error_message))
49            },
50        }
51    }
52}