use serde::{Deserialize, Deserializer};
use super::token::Token;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TradeSide {
Buy,
Sell,
Other(String),
}
impl TradeSide {
pub fn as_str(&self) -> &str {
match self {
TradeSide::Buy => "buy",
TradeSide::Sell => "sell",
TradeSide::Other(s) => s,
}
}
}
impl std::fmt::Display for TradeSide {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for TradeSide {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let raw = String::deserialize(deserializer)?;
Ok(match raw.to_ascii_lowercase().as_str() {
"buy" => TradeSide::Buy,
"sell" => TradeSide::Sell,
_ => TradeSide::Other(raw),
})
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Trade {
pub id: i64,
pub token_name: String,
pub token_symbol: String,
pub token_address: String,
#[serde(default)]
pub token_image: Option<String>,
pub swapper_address: String,
#[serde(default)]
pub swapper_username: Option<String>,
#[serde(default)]
pub swapper_avatar: Option<String>,
#[serde(rename = "type")]
pub trade_side: TradeSide,
pub eth_amount: String,
pub token_amount: String,
pub network: String,
pub date: i64,
pub tx_hash: String,
pub token_price: String,
pub eth_price: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecentTrades {
pub trades: Vec<Trade>,
pub tokens: Vec<Token>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Candle {
pub time: i64,
pub open: f64,
pub high: f64,
pub low: f64,
pub close: f64,
pub volume: f64,
}