use serde::{Deserialize, Serialize};
use crate::types::MarketId;
use crate::types::order::Side;
use crate::wallet::Address;
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize,
)]
#[serde(transparent)]
pub struct RfqId(pub u64);
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RfqStatus {
Open,
Accepted,
Expired,
Cancelled,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct MmQuote {
pub rfq_id: RfqId,
pub mm: Address,
pub price: u64,
pub size: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct RfqState {
pub rfq_id: RfqId,
pub taker: Address,
pub market: MarketId,
pub side: Side,
pub size: u64,
pub expires_at_ms: u64,
pub quotes: Vec<MmQuote>,
pub status: RfqStatus,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rfq_status_serializes_snake_case() {
assert_eq!(serde_json::to_string(&RfqStatus::Open).unwrap(), "\"open\"");
assert_eq!(
serde_json::to_string(&RfqStatus::Accepted).unwrap(),
"\"accepted\""
);
assert_eq!(
serde_json::to_string(&RfqStatus::Cancelled).unwrap(),
"\"cancelled\""
);
}
#[test]
fn rfq_state_round_trips() {
let s = RfqState {
rfq_id: RfqId(7),
taker: Address::ZERO,
market: MarketId(1),
side: Side::Bid,
size: 1_000,
expires_at_ms: 1_700_000_000_000,
quotes: vec![MmQuote {
rfq_id: RfqId(7),
mm: Address::ZERO,
price: 100,
size: 500,
}],
status: RfqStatus::Open,
};
let j = serde_json::to_string(&s).unwrap();
let dec: RfqState = serde_json::from_str(&j).unwrap();
assert_eq!(s, dec);
}
}