Skip to content

Commit 7e22886

Browse files
committed
Support cloid in batch_modify
1 parent 489e238 commit 7e22886

File tree

3 files changed

+73
-4
lines changed

3 files changed

+73
-4
lines changed

src/exchange/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub use builder::*;
1111
pub use cancel::{ClientCancelRequest, ClientCancelRequestCloid};
1212
pub use exchange_client::*;
1313
pub use exchange_responses::*;
14-
pub use modify::{ClientModifyRequest, ModifyRequest};
14+
pub use modify::{ClientModifyRequest, ModifyRequest, OidOrCloid};
1515
pub use order::{
1616
ClientLimit, ClientOrder, ClientOrderRequest, ClientTrigger, MarketCloseParams,
1717
MarketOrderParams, Order,

src/exchange/modify.rs

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,71 @@
1+
use crate::helpers::{hex_string_to_uuid, uuid_to_hex_string};
2+
13
use super::{order::OrderRequest, ClientOrderRequest};
2-
use serde::{Deserialize, Serialize};
4+
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
5+
use uuid::Uuid;
6+
7+
#[derive(Debug, Clone)]
8+
pub enum OidOrCloid {
9+
Oid(u64),
10+
Cloid(Uuid),
11+
}
12+
13+
impl Serialize for OidOrCloid {
14+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
15+
where
16+
S: Serializer,
17+
{
18+
match self {
19+
OidOrCloid::Oid(oid) => serializer.serialize_u64(*oid),
20+
// UUID rendered as compact hex (no dashes)
21+
OidOrCloid::Cloid(cloid) => serializer.serialize_str(&uuid_to_hex_string(*cloid)),
22+
}
23+
}
24+
}
25+
26+
impl<'de> Deserialize<'de> for OidOrCloid {
27+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
28+
where
29+
D: Deserializer<'de>,
30+
{
31+
struct V;
32+
33+
impl<'de> de::Visitor<'de> for V {
34+
type Value = OidOrCloid;
35+
36+
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
37+
f.write_str("a u64 or a 32-character hex UUID string")
38+
}
39+
40+
fn visit_u64<E>(self, n: u64) -> Result<Self::Value, E>
41+
where
42+
E: de::Error,
43+
{
44+
Ok(OidOrCloid::Oid(n))
45+
}
46+
47+
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
48+
where
49+
E: de::Error,
50+
{
51+
hex_string_to_uuid(s)
52+
.map(OidOrCloid::Cloid)
53+
.map_err(E::custom)
54+
}
55+
}
56+
57+
deserializer.deserialize_any(V)
58+
}
59+
}
360

461
#[derive(Debug)]
562
pub struct ClientModifyRequest {
6-
pub oid: u64,
63+
pub oid: OidOrCloid,
764
pub order: ClientOrderRequest,
865
}
966

1067
#[derive(Serialize, Deserialize, Debug, Clone)]
1168
pub struct ModifyRequest {
12-
pub oid: u64,
69+
pub oid: OidOrCloid,
1370
pub order: OrderRequest,
1471
}

src/helpers.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,18 @@ pub(crate) fn uuid_to_hex_string(uuid: Uuid) -> String {
5252
format!("0x{}", hex_string)
5353
}
5454

55+
pub(crate) fn hex_string_to_uuid(hex_string: &str) -> Result<Uuid> {
56+
if let Some(hex_string) = hex_string.strip_prefix("0x") {
57+
Ok(Uuid::from_u128(
58+
u128::from_str_radix(hex_string, 16).unwrap(),
59+
))
60+
} else {
61+
Err(Error::JsonParse(format!(
62+
"Invalid hex string: {hex_string}"
63+
)))
64+
}
65+
}
66+
5567
pub(crate) fn generate_random_key() -> Result<[u8; 32]> {
5668
let mut arr = [0u8; 32];
5769
thread_rng()

0 commit comments

Comments
 (0)