1use crate::{request, Client, StatusCode};
2use serde::{Deserialize, Serialize};
3
4#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct FMPQuote {
7 pub symbol: String,
8 pub name: String,
9 pub price: f64,
10 pub changes_percentage: f64,
11 pub change: f64,
12 pub day_low: f64,
13 pub day_high: f64,
14 pub year_high: f64,
15 pub year_low: f64,
16 pub market_cap: f64,
17 pub price_avg50: f64,
18 pub price_avg200: f64,
19 pub volume: f64,
20 pub avg_volume: f64,
21 pub exchange: String,
22 pub open: f64,
23 pub previous_close: f64,
24 pub eps: f64,
25 pub pe: f64,
26 pub earnings_announcement: String,
27 pub shares_outstanding: f64,
28 pub timestamp: f64,
29}
30
31impl Client {
32 pub async fn batch_quotes(&self, tickers: Vec<&str>) -> Result<Vec<FMPQuote>, StatusCode> {
33 let ticker = tickers.join(",");
34 request(format!(
35 "{}/v3/quote/{}?apikey={}",
36 self.base, ticker, self.api_key,
37 ))
38 .await
39 }
40
41 pub async fn quote(&self, ticker: &str) -> Result<Option<FMPQuote>, StatusCode> {
42 let quotes = self.batch_quotes(vec![ticker]).await?;
43 Ok(quotes.into_iter().next())
44 }
45}