Skip to content

Commit b51f0dc

Browse files
authored
Merge pull request #33 from pbeets/fix/pr31-cleanup
fix: deduplicate null_as_empty_vec and normalize user_order channel name
2 parents 826c559 + 2bc61ff commit b51f0dc

File tree

4 files changed

+25
-24
lines changed

4 files changed

+25
-24
lines changed

src/models/common.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,22 @@ pub fn cents_to_dollars(cents: i64) -> f64 {
110110
cents as f64 / 100.0
111111
}
112112

113+
/// Custom deserializer that treats `null` as an empty `Vec`.
114+
///
115+
/// The Kalshi API sometimes returns `null` instead of `[]` for empty arrays.
116+
/// Use with `#[serde(default, deserialize_with = "null_as_empty_vec::deserialize")]`.
117+
pub(crate) mod null_as_empty_vec {
118+
use serde::{Deserialize, Deserializer};
119+
120+
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
121+
where
122+
D: Deserializer<'de>,
123+
T: Deserialize<'de>,
124+
{
125+
Ok(Option::<Vec<T>>::deserialize(deserializer)?.unwrap_or_default())
126+
}
127+
}
128+
113129
#[cfg(test)]
114130
mod tests {
115131
use super::*;

src/models/market.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -542,19 +542,7 @@ mod orderbook_serde {
542542
}
543543
}
544544

545-
/// Custom deserializer for Vec that treats null as empty.
546-
mod null_as_empty_vec {
547-
use serde::{Deserialize, Deserializer};
548-
549-
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
550-
where
551-
D: Deserializer<'de>,
552-
T: Deserialize<'de>,
553-
{
554-
let opt: Option<Vec<T>> = Option::deserialize(deserializer)?;
555-
Ok(opt.unwrap_or_default())
556-
}
557-
}
545+
use super::common::null_as_empty_vec;
558546

559547
/// An orderbook for a market.
560548
#[derive(Debug, Clone, Default, Serialize, Deserialize)]

src/models/order.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -975,17 +975,7 @@ impl GetQueuePositionsParams {
975975
}
976976
}
977977

978-
mod null_as_empty_vec {
979-
use serde::{Deserialize, Deserializer};
980-
981-
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
982-
where
983-
D: Deserializer<'de>,
984-
T: Deserialize<'de>,
985-
{
986-
Ok(Option::<Vec<T>>::deserialize(deserializer)?.unwrap_or_default())
987-
}
988-
}
978+
use super::common::null_as_empty_vec;
989979

990980
#[cfg(test)]
991981
mod tests {

src/ws/session.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,13 @@ impl KalshiStreamSession {
838838
}
839839

840840
Ok(IncomingMessage::Update { msg_type, sid, msg }) => {
841+
// Normalize API aliases to canonical channel names.
842+
// The Kalshi API sends "user_order" (singular) for order updates,
843+
// but the channel is subscribed as "user_orders" (plural).
844+
let msg_type = match msg_type.as_str() {
845+
"user_order" => "user_orders".to_string(),
846+
_ => msg_type,
847+
};
841848
debug!("Update on sid {}: type={}", sid, msg_type);
842849

843850
// Handle "unsubscribed" updates specially

0 commit comments

Comments
 (0)