use serde::Serialize;
#[derive(Serialize, Clone, Debug)]
pub(crate) struct CancelAction {
pub(crate) a: usize,
pub(crate) o: i64,
}
#[derive(Clone, Debug)]
pub(crate) enum HyperliquidWsOutboundMessage {
SubscribeL2Book { coin: String },
SubscribeTrades { coin: String },
SubscribeActiveAssetCtx { coin: String },
SubscribeUserEvents { user_addr: String },
SubscribeOrderUpdates { user_addr: String },
SubcribeNonFundingLedger { user_addr: String },
Unsubscribe {
subscription: serde_json::Value,
},
Ping,
#[allow(dead_code)]
PlaceOrder { payload: serde_json::Value },
#[allow(dead_code)]
CancelOrder { cancels: Vec<CancelAction> },
}
impl HyperliquidWsOutboundMessage {
pub fn to_json(&self) -> String {
match self {
HyperliquidWsOutboundMessage::SubscribeL2Book { coin } => serde_json::json!({
"method": "subscribe",
"subscription": {
"type": "l2Book",
"coin": coin,
}
})
.to_string(),
HyperliquidWsOutboundMessage::SubscribeTrades { coin } => serde_json::json!({
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": coin,
}
})
.to_string(),
HyperliquidWsOutboundMessage::SubscribeActiveAssetCtx { coin } => serde_json::json!({
"method": "subscribe",
"subscription": {
"type": "activeAssetCtx",
"coin": coin,
}
})
.to_string(),
HyperliquidWsOutboundMessage::SubscribeUserEvents { user_addr } => serde_json::json!({
"method": "subscribe",
"subscription": {
"type": "user",
"user": user_addr,
}
})
.to_string(),
HyperliquidWsOutboundMessage::SubscribeOrderUpdates { user_addr } => serde_json::json!({
"method": "subscribe",
"subscription": {
"type": "orderUpdates",
"user": user_addr,
}
})
.to_string(),
HyperliquidWsOutboundMessage::SubcribeNonFundingLedger { user_addr } => serde_json::json!({
"method": "subscribe",
"subscription": {
"type": "userNonFundingLedgerUpdates",
"user": user_addr,
}
})
.to_string(),
HyperliquidWsOutboundMessage::Unsubscribe { subscription } => serde_json::json!({
"method": "unsubscribe",
"subscription": subscription
})
.to_string(),
HyperliquidWsOutboundMessage::Ping => r#"{"method":"ping"}"#.to_string(),
HyperliquidWsOutboundMessage::PlaceOrder { payload } => payload.to_string(),
HyperliquidWsOutboundMessage::CancelOrder { cancels } => serde_json::json!({
"type": "cancel",
"cancels": cancels
})
.to_string(),
}
}
}