|
| 1 | +use crate::helpers::{hex_string_to_uuid, uuid_to_hex_string}; |
| 2 | + |
1 | 3 | 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 | +} |
3 | 60 |
|
4 | 61 | #[derive(Debug)]
|
5 | 62 | pub struct ClientModifyRequest {
|
6 |
| - pub oid: u64, |
| 63 | + pub oid: OidOrCloid, |
7 | 64 | pub order: ClientOrderRequest,
|
8 | 65 | }
|
9 | 66 |
|
10 | 67 | #[derive(Serialize, Deserialize, Debug, Clone)]
|
11 | 68 | pub struct ModifyRequest {
|
12 |
| - pub oid: u64, |
| 69 | + pub oid: OidOrCloid, |
13 | 70 | pub order: OrderRequest,
|
14 | 71 | }
|
0 commit comments