blob: ffda0d7a226b35b157a76c8e9b06fcfd5e839ed7 [file] [log] [blame]
use serde::{Deserialize, Serialize};
use std::fmt::{self, Debug};
pub const ORDER_CREATED_TYPE: &str = "order_created";
pub const ORDER_CONFIRMED_TYPE: &str = "order_confirmed";
pub const ORDER_REJECTED_TYPE: &str = "order_rejected";
pub trait SerializableMessage: Debug {
fn get_message_type(&self) -> &str;
fn to_json(&self) -> String;
fn to_json_envelope(&self) -> String;
}
// The message envelope can be used to send the different types of messages to the same topic.
#[derive(Debug, Deserialize, Serialize)]
pub struct Envelope {
pub message_type: String,
pub payload: String,
}
impl Envelope {
pub fn new<T>(message_type: &str, payload: &T) -> Envelope
where
T: Serialize,
{
Envelope {
message_type: message_type.to_string(),
payload: serde_json::to_string(payload).unwrap(),
}
}
pub fn to_json(&self) -> String {
serde_json::to_string(&self).unwrap()
}
}
#[derive(Deserialize, Serialize)]
pub struct OrderCreated {
pub order_id: u64,
pub currency_pair: String,
pub price: f64,
pub quantity: f64,
pub side: String,
pub timestamp: u64,
}
impl Debug for OrderCreated {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("OrderCreated")
.field("order_id", &self.order_id)
.field("currency_pair", &self.currency_pair)
.field("price", &format!("{:.2}", self.price))
.field("quantity", &format!("{:.2}", self.quantity))
.field("side", &self.side)
.field("timestamp", &self.timestamp)
.finish()
}
}
#[derive(Deserialize, Serialize)]
pub struct OrderConfirmed {
pub order_id: u64,
pub price: f64,
pub timestamp: u64,
}
impl Debug for OrderConfirmed {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("OrderConfirmed")
.field("order_id", &self.order_id)
.field("price", &format!("{:.2}", self.price))
.field("timestamp", &self.timestamp)
.finish()
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct OrderRejected {
pub order_id: u64,
pub timestamp: u64,
pub reason: String,
}
impl SerializableMessage for OrderCreated {
fn get_message_type(&self) -> &str {
ORDER_CREATED_TYPE
}
fn to_json(&self) -> String {
serde_json::to_string(&self).unwrap()
}
fn to_json_envelope(&self) -> String {
Envelope::new(ORDER_CREATED_TYPE, self).to_json()
}
}
impl SerializableMessage for OrderConfirmed {
fn get_message_type(&self) -> &str {
ORDER_CONFIRMED_TYPE
}
fn to_json(&self) -> String {
serde_json::to_string(&self).unwrap()
}
fn to_json_envelope(&self) -> String {
Envelope::new(ORDER_CONFIRMED_TYPE, self).to_json()
}
}
impl SerializableMessage for OrderRejected {
fn get_message_type(&self) -> &str {
ORDER_REJECTED_TYPE
}
fn to_json(&self) -> String {
serde_json::to_string(&self).unwrap()
}
fn to_json_envelope(&self) -> String {
Envelope::new(ORDER_REJECTED_TYPE, self).to_json()
}
}