Skip to main content

finlight_client/
params.rs

1use serde::{Deserialize, Serialize};
2
3/// An article category assigned by finlight's classification.
4#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
5#[serde(rename_all = "lowercase")]
6#[non_exhaustive]
7pub enum Category {
8    /// Financial markets.
9    Markets,
10    /// Macroeconomics.
11    Economy,
12    /// Company and business news.
13    Business,
14    /// Domestic politics.
15    Politics,
16    /// International relations.
17    Geopolitics,
18    /// Regulation and policy.
19    Regulation,
20    /// Technology.
21    Technology,
22    /// Energy.
23    Energy,
24    /// Commodities.
25    Commodities,
26    /// Cryptocurrencies.
27    Crypto,
28    /// Health and pharma.
29    Health,
30    /// Climate.
31    Climate,
32    /// Security and defense.
33    Security,
34}
35
36/// Sort field for article queries.
37#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
38#[serde(rename_all = "camelCase")]
39pub enum OrderBy {
40    /// Sort by publication date.
41    PublishDate,
42    /// Sort by the time finlight stored the article.
43    CreatedAt,
44    /// Sort by the publisher's revision date.
45    RevisedDate,
46}
47
48/// Sort direction for article queries.
49#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
50pub enum SortOrder {
51    /// Ascending.
52    #[serde(rename = "ASC")]
53    Asc,
54    /// Descending.
55    #[serde(rename = "DESC")]
56    Desc,
57}
58
59/// Search parameters for [`ArticleService::fetch_articles`](crate::ArticleService::fetch_articles).
60/// `None` fields are omitted from the request; the server applies its
61/// documented defaults.
62#[derive(Clone, Debug, Default, Serialize)]
63#[serde(rename_all = "camelCase")]
64pub struct GetArticlesParams {
65    /// Query in the finlight query language, e.g.
66    /// `(ticker:AAPL OR ticker:NVDA) AND NOT source:www.reuters.com AND "Elon Musk"`.
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub query: Option<String>,
69    /// Deprecated: use `sources`.
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub source: Option<String>,
72    /// Restrict results to these source domains.
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub sources: Option<Vec<String>>,
75    /// Exclude these source domains.
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub exclude_sources: Option<Vec<String>>,
78    /// Include these non-default sources.
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub opt_in_sources: Option<Vec<String>>,
81    /// Earliest publish date, `YYYY-MM-DD` or ISO 8601.
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub from: Option<String>,
84    /// Latest publish date, `YYYY-MM-DD` or ISO 8601.
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub to: Option<String>,
87    /// ISO 639-1 language code.
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub language: Option<String>,
90    /// Restrict results to articles mentioning these tickers.
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub tickers: Option<Vec<String>>,
93    /// Include recognized entities in the response.
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub include_entities: Option<bool>,
96    /// Skip articles without content.
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub exclude_empty_content: Option<bool>,
99    /// Include full article content in the response.
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub include_content: Option<bool>,
102    /// Sort field.
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub order_by: Option<OrderBy>,
105    /// Sort direction.
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub order: Option<SortOrder>,
108    /// Page size, 1–1000.
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub page_size: Option<u32>,
111    /// Page number, starting at 1.
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub page: Option<u32>,
114    /// Restrict results to these countries.
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub countries: Option<Vec<String>>,
117    /// Restrict results to these categories.
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub categories: Option<Vec<Category>>,
120}
121
122/// Parameters for [`ArticleService::fetch_article_by_link`](crate::ArticleService::fetch_article_by_link).
123#[derive(Clone, Debug, Default)]
124pub struct GetArticleByLinkParams {
125    /// URL of the article (required).
126    pub link: String,
127    /// Include full article content in the response.
128    pub include_content: bool,
129    /// Include recognized entities in the response.
130    pub include_entities: bool,
131}
132
133/// Filters for the enhanced WebSocket stream.
134#[derive(Clone, Debug, Default, Serialize)]
135#[serde(rename_all = "camelCase")]
136pub struct GetArticlesWebSocketParams {
137    /// Query in the finlight query language.
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub query: Option<String>,
140    /// Restrict the stream to these source domains.
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub sources: Option<Vec<String>>,
143    /// Exclude these source domains.
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub exclude_sources: Option<Vec<String>>,
146    /// Include these non-default sources.
147    #[serde(skip_serializing_if = "Option::is_none")]
148    pub opt_in_sources: Option<Vec<String>>,
149    /// ISO 639-1 language code.
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub language: Option<String>,
152    /// Deprecated: use `include_content`.
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub extended: Option<bool>,
155    /// Restrict the stream to articles mentioning these tickers.
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub tickers: Option<Vec<String>>,
158    /// Include recognized entities.
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub include_entities: Option<bool>,
161    /// Skip articles without content.
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub exclude_empty_content: Option<bool>,
164    /// Include full article content.
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub include_content: Option<bool>,
167    /// Restrict the stream to these countries.
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub countries: Option<Vec<String>>,
170    /// Restrict the stream to these categories.
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub categories: Option<Vec<Category>>,
173    /// Also deliver updates to previously seen articles.
174    #[serde(skip_serializing_if = "Option::is_none")]
175    pub include_updates: Option<bool>,
176}
177
178/// Filters for the raw WebSocket stream.
179#[derive(Clone, Debug, Default, Serialize)]
180#[serde(rename_all = "camelCase")]
181pub struct GetRawArticlesWebSocketParams {
182    /// Query in the finlight query language.
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub query: Option<String>,
185    /// Restrict the stream to these source domains.
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub sources: Option<Vec<String>>,
188    /// Exclude these source domains.
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub exclude_sources: Option<Vec<String>>,
191    /// Include these non-default sources.
192    #[serde(skip_serializing_if = "Option::is_none")]
193    pub opt_in_sources: Option<Vec<String>>,
194    /// ISO 639-1 language code.
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub language: Option<String>,
197    /// Also deliver updates to previously seen articles.
198    #[serde(skip_serializing_if = "Option::is_none")]
199    pub include_updates: Option<bool>,
200}