Skip to main content

longbridge/screener/
types.rs

1use serde::{Deserialize, Serialize};
2
3// ── screener_recommend_strategies ─────────────────────────────────
4
5/// Response for [`crate::ScreenerContext::screener_recommend_strategies`]
6///
7/// The raw data contains a list of recommended built-in screener
8/// strategies.  The exact structure varies so the payload is
9/// preserved as raw JSON.
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct ScreenerRecommendStrategiesResponse {
12    /// Raw recommended strategies data
13    pub data: serde_json::Value,
14}
15
16// ── screener_user_strategies ──────────────────────────────────────
17
18/// Response for [`crate::ScreenerContext::screener_user_strategies`]
19///
20/// The raw data contains the current user's saved screener strategies.
21/// The exact structure varies so the payload is preserved as raw JSON.
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct ScreenerUserStrategiesResponse {
24    /// Raw user strategies data
25    pub data: serde_json::Value,
26}
27
28// ── screener_strategy ─────────────────────────────────────────────
29
30/// Response for [`crate::ScreenerContext::screener_strategy`]
31///
32/// The raw data contains detail for one screener strategy.
33/// The exact structure varies so the payload is preserved as raw JSON.
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ScreenerStrategyResponse {
36    /// Raw strategy detail data
37    pub data: serde_json::Value,
38}
39
40// ── screener_condition ───────────────────────────────────────────
41
42/// A filter condition for [`crate::ScreenerContext::screener_search`] Mode B.
43///
44/// `key` is the indicator key (without the `filter_` prefix, e.g. `"pettm"`).
45/// `min` / `max` bound the range; leave empty for an open bound.
46/// `tech_values` is used for technical indicators (e.g. MACD/RSI); pass an
47/// empty map `{}` for fundamental indicators.
48#[derive(Debug, Clone, Serialize, Deserialize, Default)]
49pub struct ScreenerCondition {
50    /// Indicator key without `filter_` prefix, e.g. `"pettm"`, `"roe"`,
51    /// `"macd_day"`
52    pub key: String,
53    /// Lower bound (empty string = no lower bound)
54    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
55    pub min: String,
56    /// Upper bound (empty string = no upper bound)
57    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
58    pub max: String,
59    /// Technical indicator parameters (empty map for fundamental indicators).
60    /// Example: `{"category": "goldenfork", "period": "day"}`
61    #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
62    pub tech_values: serde_json::Value,
63}
64
65// ── screener_search ───────────────────────────────────────────────
66
67/// Response for [`crate::ScreenerContext::screener_search`]
68///
69/// The raw data contains a page of screened security results.
70/// The exact structure varies so the payload is preserved as raw JSON.
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct ScreenerSearchResponse {
73    /// Raw screener search results
74    pub data: serde_json::Value,
75}
76
77// ── screener_indicators ───────────────────────────────────────────
78
79/// Response for [`crate::ScreenerContext::screener_indicators`]
80///
81/// The raw data contains all available screener indicator definitions.
82/// The exact structure varies so the payload is preserved as raw JSON.
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct ScreenerIndicatorsResponse {
85    /// Raw indicator definitions
86    pub data: serde_json::Value,
87}