From 46395e5f381d734a6b8014364f5b8d1a310cfc9c Mon Sep 17 00:00:00 2001 From: Brian Li Date: Tue, 24 Jun 2025 21:23:48 -0400 Subject: [PATCH 1/2] Fix lint --- src/ws/ws_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ws/ws_manager.rs b/src/ws/ws_manager.rs index 3a78500d..d1a111ed 100755 --- a/src/ws/ws_manager.rs +++ b/src/ws/ws_manager.rs @@ -282,7 +282,7 @@ impl WsManager { } Message::ActiveAssetData(active_asset_data) => { serde_json::to_string(&Subscription::ActiveAssetData { - user: active_asset_data.data.user.clone(), + user: active_asset_data.data.user, coin: active_asset_data.data.coin.clone(), }) .map_err(|e| Error::JsonParse(e.to_string())) From 59086a50b1b5f59bfb73a9c18736aad1978fd994 Mon Sep 17 00:00:00 2001 From: Brian Li Date: Tue, 24 Jun 2025 17:56:32 -0400 Subject: [PATCH 2/2] Support cloid in batch_modify --- src/exchange/mod.rs | 2 +- src/exchange/modify.rs | 63 ++++++++++++++++++++++++++++++++++++++++-- src/helpers.rs | 12 ++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/exchange/mod.rs b/src/exchange/mod.rs index 7b9e9042..94425805 100644 --- a/src/exchange/mod.rs +++ b/src/exchange/mod.rs @@ -11,7 +11,7 @@ pub use builder::*; pub use cancel::{ClientCancelRequest, ClientCancelRequestCloid}; pub use exchange_client::*; pub use exchange_responses::*; -pub use modify::{ClientModifyRequest, ModifyRequest}; +pub use modify::{ClientModifyRequest, ModifyRequest, OidOrCloid}; pub use order::{ ClientLimit, ClientOrder, ClientOrderRequest, ClientTrigger, MarketCloseParams, MarketOrderParams, Order, diff --git a/src/exchange/modify.rs b/src/exchange/modify.rs index 01d74fc8..cdf59d5d 100644 --- a/src/exchange/modify.rs +++ b/src/exchange/modify.rs @@ -1,14 +1,71 @@ +use crate::helpers::{hex_string_to_uuid, uuid_to_hex_string}; + use super::{order::OrderRequest, ClientOrderRequest}; -use serde::{Deserialize, Serialize}; +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +use uuid::Uuid; + +#[derive(Debug, Clone)] +pub enum OidOrCloid { + Oid(u64), + Cloid(Uuid), +} + +impl Serialize for OidOrCloid { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + OidOrCloid::Oid(oid) => serializer.serialize_u64(*oid), + // UUID rendered as compact hex (no dashes) + OidOrCloid::Cloid(cloid) => serializer.serialize_str(&uuid_to_hex_string(*cloid)), + } + } +} + +impl<'de> Deserialize<'de> for OidOrCloid { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct V; + + impl<'de> de::Visitor<'de> for V { + type Value = OidOrCloid; + + fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.write_str("a u64 or a 32-character hex UUID string") + } + + fn visit_u64(self, n: u64) -> Result + where + E: de::Error, + { + Ok(OidOrCloid::Oid(n)) + } + + fn visit_str(self, s: &str) -> Result + where + E: de::Error, + { + hex_string_to_uuid(s) + .map(OidOrCloid::Cloid) + .map_err(E::custom) + } + } + + deserializer.deserialize_any(V) + } +} #[derive(Debug)] pub struct ClientModifyRequest { - pub oid: u64, + pub oid: OidOrCloid, pub order: ClientOrderRequest, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ModifyRequest { - pub oid: u64, + pub oid: OidOrCloid, pub order: OrderRequest, } diff --git a/src/helpers.rs b/src/helpers.rs index 48322deb..45727dd0 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -52,6 +52,18 @@ pub(crate) fn uuid_to_hex_string(uuid: Uuid) -> String { format!("0x{}", hex_string) } +pub(crate) fn hex_string_to_uuid(hex_string: &str) -> Result { + if let Some(hex_string) = hex_string.strip_prefix("0x") { + Ok(Uuid::from_u128( + u128::from_str_radix(hex_string, 16).unwrap(), + )) + } else { + Err(Error::JsonParse(format!( + "Invalid hex string: {hex_string}" + ))) + } +} + pub(crate) fn generate_random_key() -> Result<[u8; 32]> { let mut arr = [0u8; 32]; thread_rng()