Skip to main content

longbridge/calendar/
types.rs

1use rust_decimal::Decimal;
2use serde::{Deserialize, Serialize};
3
4/// Response for [`crate::CalendarContext::finance_calendar`]
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct CalendarEventsResponse {
7    /// Start date of the query window
8    pub date: String,
9    /// Per-day event groups
10    pub list: Vec<CalendarDateGroup>,
11    /// Pagination cursor; pass as `start` to fetch the next page, empty when
12    /// there are no more pages
13    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
14    pub next_date: String,
15}
16
17/// Events for one calendar date
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct CalendarDateGroup {
20    /// Date string, e.g. `"2025-05-02"`
21    pub date: String,
22    /// Total event count for this date
23    pub count: i32,
24    /// Event details
25    pub infos: Vec<CalendarEventInfo>,
26}
27
28/// One financial calendar event
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct CalendarEventInfo {
31    /// Security symbol
32    pub symbol: String,
33    /// Market, e.g. `"HK"`
34    pub market: String,
35    /// Event content description
36    pub content: String,
37    /// Security name
38    pub counter_name: String,
39    /// Date type label, e.g. `"盘前"`
40    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
41    pub date_type: String,
42    /// Event date string, e.g. `"2025.05.02"`
43    pub date: String,
44    /// Chart UID (may be empty)
45    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
46    pub chart_uid: String,
47    /// Structured data key-value pairs
48    pub data_kv: Vec<CalendarDataKv>,
49    /// Event type code, e.g. `"financial"`
50    #[serde(rename = "type")]
51    pub event_type: String,
52    /// Event datetime (unix timestamp string)
53    pub datetime: String,
54    /// Icon URL
55    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
56    pub icon: String,
57    /// Importance star rating (0–3)
58    pub star: i32,
59    /// Associated live stream (usually null)
60    pub live: Option<serde_json::Value>,
61    /// Internal event ID
62    pub id: String,
63    /// Financial market session time string
64    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
65    pub financial_market_time: String,
66    /// Currency
67    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
68    pub currency: String,
69    /// Extended data (structure varies by event type)
70    pub ext: Option<serde_json::Value>,
71    /// Activity type code
72    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
73    pub activity_type: String,
74}
75
76/// One key-value data pair in a calendar event
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct CalendarDataKv {
79    /// Key (may be empty)
80    pub key: String,
81    /// Formatted display value
82    pub value: String,
83    /// Value type code, e.g. `"estimate_eps"`
84    #[serde(rename = "type")]
85    pub value_type: String,
86    /// Raw numeric value (may be empty or non-numeric)
87    #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
88    pub value_raw: Option<Decimal>,
89}
90
91/// Calendar event category
92#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize)]
93pub enum CalendarCategory {
94    /// Earnings reports
95    #[serde(rename = "report")]
96    Report,
97    /// Dividend events
98    #[serde(rename = "dividend")]
99    Dividend,
100    /// Stock splits
101    #[serde(rename = "split")]
102    Split,
103    /// IPOs
104    #[serde(rename = "ipo")]
105    Ipo,
106    /// Macro-economic data releases
107    #[serde(rename = "macrodata")]
108    MacroData,
109    /// Market closure days
110    #[serde(rename = "closed")]
111    Closed,
112    /// Shareholder / analyst meetings
113    #[serde(rename = "meeting")]
114    Meeting,
115    /// Stock consolidations / mergers
116    #[serde(rename = "merge")]
117    Merge,
118}