1#[allow(unused_imports)]
4use super::*;
5#[allow(unused_imports)]
6use crate::ids::*;
7#[allow(unused_imports)]
8use crate::timestamp::Timestamp;
9#[allow(unused_imports)]
10use rust_decimal::Decimal;
11#[allow(unused_imports)]
12use serde::{Deserialize, Serialize};
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct ClientPrice {
18 #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
20 pub r#type: Option<String>,
21 #[serde(
23 rename = "instrument",
24 default,
25 skip_serializing_if = "Option::is_none"
26 )]
27 pub instrument: Option<InstrumentName>,
28 #[serde(rename = "time", default, skip_serializing_if = "Option::is_none")]
30 pub time: Option<Timestamp>,
31 #[serde(rename = "status", default, skip_serializing_if = "Option::is_none")]
33 pub status: Option<PriceStatus>,
34 #[serde(rename = "tradeable", default, skip_serializing_if = "Option::is_none")]
36 pub tradeable: Option<bool>,
37 #[serde(rename = "bids", default, skip_serializing_if = "Option::is_none")]
40 pub bids: Option<Vec<PriceBucket>>,
41 #[serde(rename = "asks", default, skip_serializing_if = "Option::is_none")]
44 pub asks: Option<Vec<PriceBucket>>,
45 #[serde(
48 rename = "closeoutBid",
49 default,
50 skip_serializing_if = "Option::is_none"
51 )]
52 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
53 pub closeout_bid: Option<Decimal>,
54 #[serde(
57 rename = "closeoutAsk",
58 default,
59 skip_serializing_if = "Option::is_none"
60 )]
61 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
62 pub closeout_ask: Option<Decimal>,
63 #[serde(
68 rename = "quoteHomeConversionFactors",
69 default,
70 skip_serializing_if = "Option::is_none"
71 )]
72 pub quote_home_conversion_factors: Option<QuoteHomeConversionFactors>,
73 #[serde(
76 rename = "unitsAvailable",
77 default,
78 skip_serializing_if = "Option::is_none"
79 )]
80 pub units_available: Option<UnitsAvailable>,
81}
82
83#[derive(Debug, Clone, PartialEq, Eq, Hash)]
85#[non_exhaustive]
86pub enum PriceStatus {
87 Tradeable,
89 NonTradeable,
91 Invalid,
93 Unknown(String),
95}
96
97impl PriceStatus {
98 pub fn as_str(&self) -> &str {
100 match self {
101 Self::Tradeable => "tradeable",
102 Self::NonTradeable => "non-tradeable",
103 Self::Invalid => "invalid",
104 Self::Unknown(value) => value,
105 }
106 }
107}
108
109impl Serialize for PriceStatus {
110 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
111 serializer.serialize_str(self.as_str())
112 }
113}
114
115impl<'de> Deserialize<'de> for PriceStatus {
116 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
117 let value = String::deserialize(deserializer)?;
118 Ok(match value.as_str() {
119 "tradeable" => Self::Tradeable,
120 "non-tradeable" => Self::NonTradeable,
121 "invalid" => Self::Invalid,
122 _ => Self::Unknown(value),
123 })
124 }
125}
126
127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
130#[serde(rename_all = "camelCase")]
131pub struct QuoteHomeConversionFactors {
132 #[serde(
136 rename = "positiveUnits",
137 default,
138 skip_serializing_if = "Option::is_none"
139 )]
140 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
141 pub positive_units: Option<Decimal>,
142 #[serde(
146 rename = "negativeUnits",
147 default,
148 skip_serializing_if = "Option::is_none"
149 )]
150 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
151 pub negative_units: Option<Decimal>,
152}
153
154#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
157#[serde(rename_all = "camelCase")]
158pub struct HomeConversions {
159 #[serde(rename = "currency", default, skip_serializing_if = "Option::is_none")]
161 pub currency: Option<Currency>,
162 #[serde(
166 rename = "accountGain",
167 default,
168 skip_serializing_if = "Option::is_none"
169 )]
170 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
171 pub account_gain: Option<Decimal>,
172 #[serde(
176 rename = "accountLoss",
177 default,
178 skip_serializing_if = "Option::is_none"
179 )]
180 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
181 pub account_loss: Option<Decimal>,
182 #[serde(
185 rename = "positionValue",
186 default,
187 skip_serializing_if = "Option::is_none"
188 )]
189 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
190 pub position_value: Option<Decimal>,
191}
192
193#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
196#[serde(rename_all = "camelCase")]
197pub struct PricingHeartbeat {
198 #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
200 pub r#type: Option<String>,
201 #[serde(rename = "time", default, skip_serializing_if = "Option::is_none")]
203 pub time: Option<Timestamp>,
204}