use serde::Deserialize;
use serde_json::Value;
use crate::{client::Client, EasyBit, Error};
#[derive(Debug, Deserialize)]
#[allow(non_snake_case)]
pub struct Status {
pub id: String,
pub status: String,
pub receiveAmount: String,
pub hashIn: Option<String>,
pub hashOut: Option<String>,
pub validationStatus: Option<String>,
pub createdAt: i128,
pub updatedAt: i128,
}
pub async fn order_status(client: &Client, id: String) -> Result<Status, Error> {
let path = "/orderStatus";
let response = reqwest::Client::new()
.get(format!("{}{}", client.get_url(), path))
.header("API-KEY", client.get_api_key())
.query(&[("id", id)])
.send()
.await?;
let json: Value = response.json().await?;
match json.get("data") {
Some(data) => {
log::info!("Raw status: {:?}", data);
let order: Status = serde_json::from_value(data.clone())?;
Ok(order)
}
None => {
let error: EasyBit = serde_json::from_value(json)?;
log::error!("{:?}", error);
Err(Error::ApiError(error))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::client::Client;
use std::env;
#[tokio::test]
async fn test_order_status() {
let client = Client::new(env::var("URL").unwrap(), env::var("API_KEY").unwrap());
let order = crate::orders::create::create_order(
&client,
crate::orders::create::Transaction {
send: "BTC".to_string(),
receive: "ETH".to_string(),
amount: 0.1,
receive_address: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e".to_string(),
extra_fee_override: None,
vpm: None,
refund_address: None,
refund_tag: None,
},
crate::orders::create::User {
payload: None,
user_device_id: Some("test".to_string()),
user_id: None,
},
crate::orders::create::Network {
send_network: None,
receive_network: None,
receive_tag: None,
},
)
.await
.unwrap();
let status = order_status(&client, order.id.clone()).await.unwrap();
log::info!("{:?}", status);
assert!(status.id == order.id);
}
}