1use crate::presentation::serialization::string_as_float_opt;
2use lightstreamer_rs::subscription::ItemUpdate;
3use pretty_simple_display::{DebugPretty, DisplaySimple};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
9#[serde(rename_all = "UPPERCASE")]
10pub enum DealingFlag {
11 #[default]
13 Closed,
14 Call,
16 Deal,
18 Edit,
20 ClosingOnly,
22 DealNoEdit,
24 Auction,
26 AuctionNoEdit,
28 Suspend,
30}
31
32#[derive(DebugPretty, Clone, DisplaySimple, Serialize, Deserialize, Default)]
35pub struct PriceData {
36 pub item_name: String,
38 pub item_pos: i32,
40 pub fields: PriceFields,
42 pub changed_fields: PriceFields,
44 pub is_snapshot: bool,
46}
47
48#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize, Default)]
50pub struct PriceFields {
51 #[serde(rename = "MID_OPEN")]
53 #[serde(with = "string_as_float_opt")]
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub mid_open: Option<f64>,
56
57 #[serde(rename = "HIGH")]
59 #[serde(with = "string_as_float_opt")]
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub high: Option<f64>,
62
63 #[serde(rename = "LOW")]
65 #[serde(with = "string_as_float_opt")]
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub low: Option<f64>,
68
69 #[serde(rename = "BIDQUOTEID")]
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub bid_quote_id: Option<String>,
73
74 #[serde(rename = "ASKQUOTEID")]
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub ask_quote_id: Option<String>,
78
79 #[serde(rename = "BIDPRICE1")]
82 #[serde(with = "string_as_float_opt")]
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub bid_price1: Option<f64>,
85
86 #[serde(rename = "BIDPRICE2")]
88 #[serde(with = "string_as_float_opt")]
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub bid_price2: Option<f64>,
91
92 #[serde(rename = "BIDPRICE3")]
94 #[serde(with = "string_as_float_opt")]
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub bid_price3: Option<f64>,
97
98 #[serde(rename = "BIDPRICE4")]
100 #[serde(with = "string_as_float_opt")]
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub bid_price4: Option<f64>,
103
104 #[serde(rename = "BIDPRICE5")]
106 #[serde(with = "string_as_float_opt")]
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub bid_price5: Option<f64>,
109
110 #[serde(rename = "ASKPRICE1")]
113 #[serde(with = "string_as_float_opt")]
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub ask_price1: Option<f64>,
116
117 #[serde(rename = "ASKPRICE2")]
119 #[serde(with = "string_as_float_opt")]
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub ask_price2: Option<f64>,
122
123 #[serde(rename = "ASKPRICE3")]
125 #[serde(with = "string_as_float_opt")]
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub ask_price3: Option<f64>,
128
129 #[serde(rename = "ASKPRICE4")]
131 #[serde(with = "string_as_float_opt")]
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub ask_price4: Option<f64>,
134
135 #[serde(rename = "ASKPRICE5")]
137 #[serde(with = "string_as_float_opt")]
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub ask_price5: Option<f64>,
140
141 #[serde(rename = "BIDSIZE1")]
144 #[serde(with = "string_as_float_opt")]
145 #[serde(skip_serializing_if = "Option::is_none")]
146 pub bid_size1: Option<f64>,
147
148 #[serde(rename = "BIDSIZE2")]
150 #[serde(with = "string_as_float_opt")]
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub bid_size2: Option<f64>,
153
154 #[serde(rename = "BIDSIZE3")]
156 #[serde(with = "string_as_float_opt")]
157 #[serde(skip_serializing_if = "Option::is_none")]
158 pub bid_size3: Option<f64>,
159
160 #[serde(rename = "BIDSIZE4")]
162 #[serde(with = "string_as_float_opt")]
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub bid_size4: Option<f64>,
165
166 #[serde(rename = "BIDSIZE5")]
168 #[serde(with = "string_as_float_opt")]
169 #[serde(skip_serializing_if = "Option::is_none")]
170 pub bid_size5: Option<f64>,
171
172 #[serde(rename = "ASKSIZE1")]
175 #[serde(with = "string_as_float_opt")]
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub ask_size1: Option<f64>,
178
179 #[serde(rename = "ASKSIZE2")]
181 #[serde(with = "string_as_float_opt")]
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub ask_size2: Option<f64>,
184
185 #[serde(rename = "ASKSIZE3")]
187 #[serde(with = "string_as_float_opt")]
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub ask_size3: Option<f64>,
190
191 #[serde(rename = "ASKSIZE4")]
193 #[serde(with = "string_as_float_opt")]
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub ask_size4: Option<f64>,
196
197 #[serde(rename = "ASKSIZE5")]
199 #[serde(with = "string_as_float_opt")]
200 #[serde(skip_serializing_if = "Option::is_none")]
201 pub ask_size5: Option<f64>,
202
203 #[serde(rename = "CURRENCY0")]
205 #[serde(skip_serializing_if = "Option::is_none")]
206 pub currency0: Option<String>,
207
208 #[serde(rename = "CURRENCY1")]
210 #[serde(skip_serializing_if = "Option::is_none")]
211 pub currency1: Option<String>,
212
213 #[serde(rename = "CURRENCY2")]
215 #[serde(skip_serializing_if = "Option::is_none")]
216 pub currency2: Option<String>,
217
218 #[serde(rename = "CURRENCY3")]
220 #[serde(skip_serializing_if = "Option::is_none")]
221 pub currency3: Option<String>,
222
223 #[serde(rename = "CURRENCY4")]
225 #[serde(skip_serializing_if = "Option::is_none")]
226 pub currency4: Option<String>,
227
228 #[serde(rename = "CURRENCY5")]
230 #[serde(skip_serializing_if = "Option::is_none")]
231 pub currency5: Option<String>,
232
233 #[serde(rename = "C1BIDSIZE1")]
235 #[serde(with = "string_as_float_opt")]
236 #[serde(skip_serializing_if = "Option::is_none")]
237 pub c1_bid_size_1: Option<f64>,
238
239 #[serde(rename = "C1BIDSIZE2")]
241 #[serde(with = "string_as_float_opt")]
242 #[serde(skip_serializing_if = "Option::is_none")]
243 pub c1_bid_size_2: Option<f64>,
244
245 #[serde(rename = "C1BIDSIZE3")]
247 #[serde(with = "string_as_float_opt")]
248 #[serde(skip_serializing_if = "Option::is_none")]
249 pub c1_bid_size_3: Option<f64>,
250
251 #[serde(rename = "C1BIDSIZE4")]
253 #[serde(with = "string_as_float_opt")]
254 #[serde(skip_serializing_if = "Option::is_none")]
255 pub c1_bid_size_4: Option<f64>,
256
257 #[serde(rename = "C1BIDSIZE5")]
259 #[serde(with = "string_as_float_opt")]
260 #[serde(skip_serializing_if = "Option::is_none")]
261 pub c1_bid_size_5: Option<f64>,
262
263 #[serde(rename = "C2BIDSIZE1")]
265 #[serde(with = "string_as_float_opt")]
266 #[serde(skip_serializing_if = "Option::is_none")]
267 pub c2_bid_size_1: Option<f64>,
268
269 #[serde(rename = "C2BIDSIZE2")]
271 #[serde(with = "string_as_float_opt")]
272 #[serde(skip_serializing_if = "Option::is_none")]
273 pub c2_bid_size_2: Option<f64>,
274
275 #[serde(rename = "C2BIDSIZE3")]
277 #[serde(with = "string_as_float_opt")]
278 #[serde(skip_serializing_if = "Option::is_none")]
279 pub c2_bid_size_3: Option<f64>,
280
281 #[serde(rename = "C2BIDSIZE4")]
283 #[serde(with = "string_as_float_opt")]
284 #[serde(skip_serializing_if = "Option::is_none")]
285 pub c2_bid_size_4: Option<f64>,
286
287 #[serde(rename = "C2BIDSIZE5")]
289 #[serde(with = "string_as_float_opt")]
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub c2_bid_size_5: Option<f64>,
292
293 #[serde(rename = "C3BIDSIZE1")]
295 #[serde(with = "string_as_float_opt")]
296 #[serde(skip_serializing_if = "Option::is_none")]
297 pub c3_bid_size_1: Option<f64>,
298
299 #[serde(rename = "C3BIDSIZE2")]
301 #[serde(with = "string_as_float_opt")]
302 #[serde(skip_serializing_if = "Option::is_none")]
303 pub c3_bid_size_2: Option<f64>,
304
305 #[serde(rename = "C3BIDSIZE3")]
307 #[serde(with = "string_as_float_opt")]
308 #[serde(skip_serializing_if = "Option::is_none")]
309 pub c3_bid_size_3: Option<f64>,
310
311 #[serde(rename = "C3BIDSIZE4")]
313 #[serde(with = "string_as_float_opt")]
314 #[serde(skip_serializing_if = "Option::is_none")]
315 pub c3_bid_size_4: Option<f64>,
316
317 #[serde(rename = "C3BIDSIZE5")]
319 #[serde(with = "string_as_float_opt")]
320 #[serde(skip_serializing_if = "Option::is_none")]
321 pub c3_bid_size_5: Option<f64>,
322
323 #[serde(rename = "C4BIDSIZE1")]
325 #[serde(with = "string_as_float_opt")]
326 #[serde(skip_serializing_if = "Option::is_none")]
327 pub c4_bid_size_1: Option<f64>,
328
329 #[serde(rename = "C4BIDSIZE2")]
331 #[serde(with = "string_as_float_opt")]
332 #[serde(skip_serializing_if = "Option::is_none")]
333 pub c4_bid_size_2: Option<f64>,
334
335 #[serde(rename = "C4BIDSIZE3")]
337 #[serde(with = "string_as_float_opt")]
338 #[serde(skip_serializing_if = "Option::is_none")]
339 pub c4_bid_size_3: Option<f64>,
340
341 #[serde(rename = "C4BIDSIZE4")]
343 #[serde(with = "string_as_float_opt")]
344 #[serde(skip_serializing_if = "Option::is_none")]
345 pub c4_bid_size_4: Option<f64>,
346
347 #[serde(rename = "C4BIDSIZE5")]
349 #[serde(with = "string_as_float_opt")]
350 #[serde(skip_serializing_if = "Option::is_none")]
351 pub c4_bid_size_5: Option<f64>,
352
353 #[serde(rename = "C5BIDSIZE1")]
355 #[serde(with = "string_as_float_opt")]
356 #[serde(skip_serializing_if = "Option::is_none")]
357 pub c5_bid_size_1: Option<f64>,
358
359 #[serde(rename = "C5BIDSIZE2")]
361 #[serde(with = "string_as_float_opt")]
362 #[serde(skip_serializing_if = "Option::is_none")]
363 pub c5_bid_size_2: Option<f64>,
364
365 #[serde(rename = "C5BIDSIZE3")]
367 #[serde(with = "string_as_float_opt")]
368 #[serde(skip_serializing_if = "Option::is_none")]
369 pub c5_bid_size_3: Option<f64>,
370
371 #[serde(rename = "C5BIDSIZE4")]
373 #[serde(with = "string_as_float_opt")]
374 #[serde(skip_serializing_if = "Option::is_none")]
375 pub c5_bid_size_4: Option<f64>,
376
377 #[serde(rename = "C5BIDSIZE5")]
379 #[serde(with = "string_as_float_opt")]
380 #[serde(skip_serializing_if = "Option::is_none")]
381 pub c5_bid_size_5: Option<f64>,
382
383 #[serde(rename = "C1ASKSIZE1")]
386 #[serde(with = "string_as_float_opt")]
387 #[serde(skip_serializing_if = "Option::is_none")]
388 pub c1_ask_size_1: Option<f64>,
389
390 #[serde(rename = "C1ASKSIZE2")]
392 #[serde(with = "string_as_float_opt")]
393 #[serde(skip_serializing_if = "Option::is_none")]
394 pub c1_ask_size_2: Option<f64>,
395
396 #[serde(rename = "C1ASKSIZE3")]
398 #[serde(with = "string_as_float_opt")]
399 #[serde(skip_serializing_if = "Option::is_none")]
400 pub c1_ask_size_3: Option<f64>,
401
402 #[serde(rename = "C1ASKSIZE4")]
404 #[serde(with = "string_as_float_opt")]
405 #[serde(skip_serializing_if = "Option::is_none")]
406 pub c1_ask_size_4: Option<f64>,
407
408 #[serde(rename = "C1ASKSIZE5")]
410 #[serde(with = "string_as_float_opt")]
411 #[serde(skip_serializing_if = "Option::is_none")]
412 pub c1_ask_size_5: Option<f64>,
413
414 #[serde(rename = "C2ASKSIZE1")]
416 #[serde(with = "string_as_float_opt")]
417 #[serde(skip_serializing_if = "Option::is_none")]
418 pub c2_ask_size_1: Option<f64>,
419
420 #[serde(rename = "C2ASKSIZE2")]
422 #[serde(with = "string_as_float_opt")]
423 #[serde(skip_serializing_if = "Option::is_none")]
424 pub c2_ask_size_2: Option<f64>,
425
426 #[serde(rename = "C2ASKSIZE3")]
428 #[serde(with = "string_as_float_opt")]
429 #[serde(skip_serializing_if = "Option::is_none")]
430 pub c2_ask_size_3: Option<f64>,
431
432 #[serde(rename = "C2ASKSIZE4")]
434 #[serde(with = "string_as_float_opt")]
435 #[serde(skip_serializing_if = "Option::is_none")]
436 pub c2_ask_size_4: Option<f64>,
437
438 #[serde(rename = "C2ASKSIZE5")]
440 #[serde(with = "string_as_float_opt")]
441 #[serde(skip_serializing_if = "Option::is_none")]
442 pub c2_ask_size_5: Option<f64>,
443
444 #[serde(rename = "C3ASKSIZE1")]
446 #[serde(with = "string_as_float_opt")]
447 #[serde(skip_serializing_if = "Option::is_none")]
448 pub c3_ask_size_1: Option<f64>,
449
450 #[serde(rename = "C3ASKSIZE2")]
452 #[serde(with = "string_as_float_opt")]
453 #[serde(skip_serializing_if = "Option::is_none")]
454 pub c3_ask_size_2: Option<f64>,
455
456 #[serde(rename = "C3ASKSIZE3")]
458 #[serde(with = "string_as_float_opt")]
459 #[serde(skip_serializing_if = "Option::is_none")]
460 pub c3_ask_size_3: Option<f64>,
461
462 #[serde(rename = "C3ASKSIZE4")]
464 #[serde(with = "string_as_float_opt")]
465 #[serde(skip_serializing_if = "Option::is_none")]
466 pub c3_ask_size_4: Option<f64>,
467
468 #[serde(rename = "C3ASKSIZE5")]
470 #[serde(with = "string_as_float_opt")]
471 #[serde(skip_serializing_if = "Option::is_none")]
472 pub c3_ask_size_5: Option<f64>,
473
474 #[serde(rename = "C4ASKSIZE1")]
476 #[serde(with = "string_as_float_opt")]
477 #[serde(skip_serializing_if = "Option::is_none")]
478 pub c4_ask_size_1: Option<f64>,
479
480 #[serde(rename = "C4ASKSIZE2")]
482 #[serde(with = "string_as_float_opt")]
483 #[serde(skip_serializing_if = "Option::is_none")]
484 pub c4_ask_size_2: Option<f64>,
485
486 #[serde(rename = "C4ASKSIZE3")]
488 #[serde(with = "string_as_float_opt")]
489 #[serde(skip_serializing_if = "Option::is_none")]
490 pub c4_ask_size_3: Option<f64>,
491
492 #[serde(rename = "C4ASKSIZE4")]
494 #[serde(with = "string_as_float_opt")]
495 #[serde(skip_serializing_if = "Option::is_none")]
496 pub c4_ask_size_4: Option<f64>,
497
498 #[serde(rename = "C4ASKSIZE5")]
500 #[serde(with = "string_as_float_opt")]
501 #[serde(skip_serializing_if = "Option::is_none")]
502 pub c4_ask_size_5: Option<f64>,
503
504 #[serde(rename = "C5ASKSIZE1")]
506 #[serde(with = "string_as_float_opt")]
507 #[serde(skip_serializing_if = "Option::is_none")]
508 pub c5_ask_size_1: Option<f64>,
509
510 #[serde(rename = "C5ASKSIZE2")]
512 #[serde(with = "string_as_float_opt")]
513 #[serde(skip_serializing_if = "Option::is_none")]
514 pub c5_ask_size_2: Option<f64>,
515
516 #[serde(rename = "C5ASKSIZE3")]
518 #[serde(with = "string_as_float_opt")]
519 #[serde(skip_serializing_if = "Option::is_none")]
520 pub c5_ask_size_3: Option<f64>,
521
522 #[serde(rename = "C5ASKSIZE4")]
524 #[serde(with = "string_as_float_opt")]
525 #[serde(skip_serializing_if = "Option::is_none")]
526 pub c5_ask_size_4: Option<f64>,
527
528 #[serde(rename = "C5ASKSIZE5")]
530 #[serde(with = "string_as_float_opt")]
531 #[serde(skip_serializing_if = "Option::is_none")]
532 pub c5_ask_size_5: Option<f64>,
533
534 #[serde(rename = "TIMESTAMP")]
536 #[serde(with = "string_as_float_opt")]
537 #[serde(skip_serializing_if = "Option::is_none")]
538 pub timestamp: Option<f64>,
539
540 #[serde(rename = "DLG_FLAG")]
542 #[serde(skip_serializing_if = "Option::is_none")]
543 pub dealing_flag: Option<DealingFlag>,
544}
545
546impl PriceData {
547 pub fn from_item_update(item_update: &ItemUpdate) -> Result<Self, String> {
557 let item_name = item_update.item_name.clone().unwrap_or_default();
559
560 let item_pos = item_update.item_pos as i32;
562
563 let is_snapshot = item_update.is_snapshot;
565
566 let fields = Self::create_price_fields(&item_update.fields)?;
568
569 let mut changed_fields_map: HashMap<String, Option<String>> = HashMap::new();
571 for (key, value) in &item_update.changed_fields {
572 changed_fields_map.insert(key.clone(), Some(value.clone()));
573 }
574 let changed_fields = Self::create_price_fields(&changed_fields_map)?;
575
576 Ok(PriceData {
577 item_name,
578 item_pos,
579 fields,
580 changed_fields,
581 is_snapshot,
582 })
583 }
584
585 fn create_price_fields(
587 fields_map: &HashMap<String, Option<String>>,
588 ) -> Result<PriceFields, String> {
589 let get_field = |key: &str| -> Option<String> { fields_map.get(key).cloned().flatten() };
591
592 let parse_float = |key: &str| -> Result<Option<f64>, String> {
594 match get_field(key) {
595 Some(val) if !val.is_empty() => val
596 .parse::<f64>()
597 .map(Some)
598 .map_err(|_| format!("Failed to parse {key} as float: {val}")),
599 _ => Ok(None),
600 }
601 };
602
603 let dealing_flag = match get_field("DLG_FLAG").as_deref() {
605 Some("CLOSED") => Some(DealingFlag::Closed),
606 Some("CALL") => Some(DealingFlag::Call),
607 Some("DEAL") => Some(DealingFlag::Deal),
608 Some("EDIT") => Some(DealingFlag::Edit),
609 Some("CLOSINGONLY") => Some(DealingFlag::ClosingOnly),
610 Some("DEALNOEDIT") => Some(DealingFlag::DealNoEdit),
611 Some("AUCTION") => Some(DealingFlag::Auction),
612 Some("AUCTIONNOEDIT") => Some(DealingFlag::AuctionNoEdit),
613 Some("SUSPEND") => Some(DealingFlag::Suspend),
614 Some(unknown) => return Err(format!("Unknown dealing flag: {unknown}")),
615 None => None,
616 };
617
618 Ok(PriceFields {
619 mid_open: parse_float("MID_OPEN")?,
620 high: parse_float("HIGH")?,
621 low: parse_float("LOW")?,
622 bid_quote_id: get_field("BIDQUOTEID"),
623 ask_quote_id: get_field("ASKQUOTEID"),
624
625 bid_price1: parse_float("BIDPRICE1")?,
627 bid_price2: parse_float("BIDPRICE2")?,
628 bid_price3: parse_float("BIDPRICE3")?,
629 bid_price4: parse_float("BIDPRICE4")?,
630 bid_price5: parse_float("BIDPRICE5")?,
631
632 ask_price1: parse_float("ASKPRICE1")?,
634 ask_price2: parse_float("ASKPRICE2")?,
635 ask_price3: parse_float("ASKPRICE3")?,
636 ask_price4: parse_float("ASKPRICE4")?,
637 ask_price5: parse_float("ASKPRICE5")?,
638
639 bid_size1: parse_float("BIDSIZE1")?,
641 bid_size2: parse_float("BIDSIZE2")?,
642 bid_size3: parse_float("BIDSIZE3")?,
643 bid_size4: parse_float("BIDSIZE4")?,
644 bid_size5: parse_float("BIDSIZE5")?,
645
646 ask_size1: parse_float("ASKSIZE1")?,
648 ask_size2: parse_float("ASKSIZE2")?,
649 ask_size3: parse_float("ASKSIZE3")?,
650 ask_size4: parse_float("ASKSIZE4")?,
651 ask_size5: parse_float("ASKSIZE5")?,
652
653 currency0: get_field("CURRENCY0"),
655 currency1: get_field("CURRENCY1"),
656 currency2: get_field("CURRENCY2"),
657 currency3: get_field("CURRENCY3"),
658 currency4: get_field("CURRENCY4"),
659 currency5: get_field("CURRENCY5"),
660
661 c1_bid_size_1: parse_float("C1BIDSIZE1")?,
663 c1_bid_size_2: parse_float("C1BIDSIZE2")?,
664 c1_bid_size_3: parse_float("C1BIDSIZE3")?,
665 c1_bid_size_4: parse_float("C1BIDSIZE4")?,
666 c1_bid_size_5: parse_float("C1BIDSIZE5")?,
667
668 c2_bid_size_1: parse_float("C2BIDSIZE1")?,
669 c2_bid_size_2: parse_float("C2BIDSIZE2")?,
670 c2_bid_size_3: parse_float("C2BIDSIZE3")?,
671 c2_bid_size_4: parse_float("C2BIDSIZE4")?,
672 c2_bid_size_5: parse_float("C2BIDSIZE5")?,
673
674 c3_bid_size_1: parse_float("C3BIDSIZE1")?,
675 c3_bid_size_2: parse_float("C3BIDSIZE2")?,
676 c3_bid_size_3: parse_float("C3BIDSIZE3")?,
677 c3_bid_size_4: parse_float("C3BIDSIZE4")?,
678 c3_bid_size_5: parse_float("C3BIDSIZE5")?,
679
680 c4_bid_size_1: parse_float("C4BIDSIZE1")?,
681 c4_bid_size_2: parse_float("C4BIDSIZE2")?,
682 c4_bid_size_3: parse_float("C4BIDSIZE3")?,
683 c4_bid_size_4: parse_float("C4BIDSIZE4")?,
684 c4_bid_size_5: parse_float("C4BIDSIZE5")?,
685
686 c5_bid_size_1: parse_float("C5BIDSIZE1")?,
687 c5_bid_size_2: parse_float("C5BIDSIZE2")?,
688 c5_bid_size_3: parse_float("C5BIDSIZE3")?,
689 c5_bid_size_4: parse_float("C5BIDSIZE4")?,
690 c5_bid_size_5: parse_float("C5BIDSIZE5")?,
691
692 c1_ask_size_1: parse_float("C1ASKSIZE1")?,
694 c1_ask_size_2: parse_float("C1ASKSIZE2")?,
695 c1_ask_size_3: parse_float("C1ASKSIZE3")?,
696 c1_ask_size_4: parse_float("C1ASKSIZE4")?,
697 c1_ask_size_5: parse_float("C1ASKSIZE5")?,
698
699 c2_ask_size_1: parse_float("C2ASKSIZE1")?,
700 c2_ask_size_2: parse_float("C2ASKSIZE2")?,
701 c2_ask_size_3: parse_float("C2ASKSIZE3")?,
702 c2_ask_size_4: parse_float("C2ASKSIZE4")?,
703 c2_ask_size_5: parse_float("C2ASKSIZE5")?,
704
705 c3_ask_size_1: parse_float("C3ASKSIZE1")?,
706 c3_ask_size_2: parse_float("C3ASKSIZE2")?,
707 c3_ask_size_3: parse_float("C3ASKSIZE3")?,
708 c3_ask_size_4: parse_float("C3ASKSIZE4")?,
709 c3_ask_size_5: parse_float("C3ASKSIZE5")?,
710
711 c4_ask_size_1: parse_float("C4ASKSIZE1")?,
712 c4_ask_size_2: parse_float("C4ASKSIZE2")?,
713 c4_ask_size_3: parse_float("C4ASKSIZE3")?,
714 c4_ask_size_4: parse_float("C4ASKSIZE4")?,
715 c4_ask_size_5: parse_float("C4ASKSIZE5")?,
716
717 c5_ask_size_1: parse_float("C5ASKSIZE1")?,
718 c5_ask_size_2: parse_float("C5ASKSIZE2")?,
719 c5_ask_size_3: parse_float("C5ASKSIZE3")?,
720 c5_ask_size_4: parse_float("C5ASKSIZE4")?,
721 c5_ask_size_5: parse_float("C5ASKSIZE5")?,
722
723 timestamp: parse_float("TIMESTAMP")?,
724 dealing_flag,
725 })
726 }
727}
728
729impl From<&ItemUpdate> for PriceData {
730 fn from(item_update: &ItemUpdate) -> Self {
731 PriceData::from_item_update(item_update).unwrap_or_default()
732 }
733}