1use serde::{Deserialize, Serialize};
2
3use crate::{client::Client, error::Error};
4
5#[derive(Debug, Serialize, Deserialize)]
6#[serde(rename_all = "camelCase")]
7pub struct StockListFilter {
8 pub country_codes: Vec<String>,
9}
10
11#[derive(Debug, Serialize, Deserialize)]
12#[serde(rename_all = "camelCase")]
13pub struct StockListSortBy {
14 pub field: String,
15 pub order: String,
16}
17
18#[derive(Debug, Serialize, Deserialize)]
19#[serde(rename_all = "camelCase")]
20pub struct StockListRequest {
21 pub filter: StockListFilter,
22 pub limit: u32,
23 pub offset: u32,
24 pub sort_by: StockListSortBy,
25}
26
27#[derive(Debug, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct Instrument {
30 pub orderbook_id: String,
31 pub r#type: String,
32 pub name: String,
33 pub short_name: String,
34 pub currency: String,
35 pub country_code: String,
36 pub direct_yield: f64,
37 pub price_earnings_ratio: f64,
38 pub number_of_owners: u32,
39}
40
41#[derive(Debug, Serialize, Deserialize)]
42#[serde(rename_all = "camelCase")]
43pub struct StockListResponsePagination {
44 pub offset: u32,
45 pub limit: u32
46}
47
48#[derive(Debug, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct StockListResponse {
51 pub stocks: Vec<Instrument>,
52 pub total_number_of_orderbooks: u32,
53 pub pagination: StockListResponsePagination,
54}
55
56impl Client {
57 pub async fn get_stock_list(
58 &self,
59 request: &StockListRequest,
60 ) -> Result<StockListResponse, Error> {
61 let res = self
62 .http_client
63 .post(&self.config.urls.stock_list)
64 .body_json(&request)?
65 .recv_json::<StockListResponse>()
66 .await?;
67 return Ok(res);
68 }
69}