digdigdig3_station/data/
open_interest.rs1use digdigdig3::core::types::StreamEvent;
2use serde::{Deserialize, Serialize};
3
4use crate::series::DataPoint;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct OpenInterestPoint {
9 pub ts_ms: i64,
10 pub open_interest: f64,
11 pub open_interest_value: f64,
12}
13
14const SIZE: usize = 24;
15
16impl DataPoint for OpenInterestPoint {
17 const RECORD_SIZE: usize = SIZE;
18
19 fn encode(&self, out: &mut [u8]) {
20 out[0..8].copy_from_slice(&(self.ts_ms as u64).to_le_bytes());
21 out[8..16].copy_from_slice(&self.open_interest.to_le_bytes());
22 out[16..24].copy_from_slice(&self.open_interest_value.to_le_bytes());
23 }
24
25 fn decode(bytes: &[u8]) -> Option<Self> {
26 if bytes.len() != SIZE { return None; }
27 Some(Self {
28 ts_ms: u64::from_le_bytes(bytes[0..8].try_into().ok()?) as i64,
29 open_interest: f64::from_le_bytes(bytes[8..16].try_into().ok()?),
30 open_interest_value: f64::from_le_bytes(bytes[16..24].try_into().ok()?),
31 })
32 }
33
34 fn timestamp_ms(&self) -> i64 { self.ts_ms }
35
36 fn from_stream_event(ev: &StreamEvent) -> Option<Self> {
37 if let StreamEvent::OpenInterestUpdate { open_interest, .. } = ev {
38 Some(Self {
39 ts_ms: open_interest.timestamp,
40 open_interest: open_interest.open_interest,
41 open_interest_value: open_interest.open_interest_value.unwrap_or(f64::NAN),
42 })
43 } else {
44 None
45 }
46 }
47}