Skip to main content

longbridge/calendar/
types.rs

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