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}