Skip to main content

longbridge/sharelist/
types.rs

1use rust_decimal::Decimal;
2use serde::{Deserialize, Serialize};
3use time::OffsetDateTime;
4
5/// Response for [`crate::SharelistContext::list`] and
6/// [`crate::SharelistContext::popular`]
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct SharelistList {
9    /// User's own and followed sharelists
10    pub sharelists: Vec<SharelistInfo>,
11    /// Subscribed sharelists (may be absent in popular response)
12    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
13    pub subscribed_sharelists: Vec<SharelistInfo>,
14    /// Pagination cursor for subscribed list
15    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
16    pub tail_mark: String,
17}
18
19/// Response for [`crate::SharelistContext::detail`]
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct SharelistDetail {
22    /// Sharelist info
23    pub sharelist: SharelistInfo,
24    /// Subscription scopes
25    pub scopes: SharelistScopes,
26}
27
28/// Sharelist information
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct SharelistInfo {
31    /// Sharelist ID (may be string or integer in API)
32    #[serde(deserialize_with = "crate::serde_utils::deserialize_id_as_i64")]
33    pub id: i64,
34    /// Name
35    pub name: String,
36    /// Description
37    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
38    pub description: String,
39    /// Cover image URL
40    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
41    pub cover: String,
42    /// Number of subscribers (may be null)
43    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
44    pub subscribers_count: i64,
45    /// Creation time
46    #[serde(deserialize_with = "crate::serde_utils::deserialize_timestamp")]
47    pub created_at: OffsetDateTime,
48    /// Last stock edit time
49    #[serde(deserialize_with = "crate::serde_utils::deserialize_timestamp")]
50    pub edited_at: OffsetDateTime,
51    /// YTD change percentage
52    #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
53    pub this_year_chg: Option<Decimal>,
54    /// Creator info
55    pub creator: serde_json::Value,
56    /// Constituent stocks
57    pub stocks: Vec<SharelistStock>,
58    /// Whether the current user is subscribed
59    pub subscribed: bool,
60    /// Day change percentage
61    #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
62    pub chg: Option<Decimal>,
63    /// Sharelist type: 0=regular, 3=official, 4=industry
64    pub sharelist_type: i32,
65    /// Industry code (for industry sharelists)
66    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
67    pub industry_code: String,
68}
69
70/// Stock in a sharelist
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct SharelistStock {
73    /// Security symbol
74    pub symbol: String,
75    /// Security name
76    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
77    pub name: String,
78    /// Market, e.g. `"HK"`
79    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
80    pub market: String,
81    /// Ticker code
82    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
83    pub code: String,
84    /// Brief description
85    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
86    pub intro: String,
87    /// Unread change log category
88    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
89    pub unread_change_log_category: String,
90    /// Day change percentage
91    #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
92    pub change: Option<Decimal>,
93    /// Latest price
94    #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
95    pub last_done: Option<Decimal>,
96    /// Trade status code
97    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
98    pub trade_status: Option<i32>,
99    /// Whether delayed quote
100    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
101    pub latency: Option<bool>,
102}
103
104/// Sharelist subscription scopes
105#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct SharelistScopes {
107    /// Whether the current user is subscribed
108    pub subscription: bool,
109    /// Whether the current user is the creator
110    #[serde(rename = "self")]
111    pub is_self: bool,
112}