use serde::Deserialize;
use crate::api::response::Response;
use crate::Str;
#[derive(Clone, Copy, Debug, Deserialize, PartialEq)]
pub enum Market {
#[serde(rename = "STOCKS")]
Stocks,
#[serde(rename = "INDEX")]
Indices,
#[serde(rename = "FX")]
ForeignExchange,
}
impl AsRef<str> for Market {
fn as_ref(&self) -> &'static str {
match *self {
Market::Stocks => "STOCKS",
Market::Indices => "INDEX",
Market::ForeignExchange => "FX",
}
}
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq)]
pub enum Type {
#[serde(rename = "CS")]
CommonStock,
#[serde(other)]
Other,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Ticker {
#[serde(rename = "ticker")]
pub ticker: String,
#[serde(rename = "name")]
pub name: String,
#[serde(rename = "market")]
pub market: Market,
#[serde(rename = "locale")]
pub locale: String,
#[serde(rename = "currency")]
pub currency: String,
#[serde(rename = "active")]
pub active: bool,
#[serde(rename = "type")]
pub type_: Option<Type>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct TickerResp {
#[serde(rename = "ticker")]
pub ticker: Ticker,
}
Endpoint! {
pub Get(String),
Ok => Response<TickerResp>, [
OK,
],
Err => GetError, [
NOT_FOUND => NotFound,
]
fn path(input: &Self::Input) -> Str {
format!("/v2/reference/tickers/{}", input).into()
}
}
#[cfg(not(target_arch = "wasm32"))]
#[cfg(test)]
mod tests {
use super::*;
use test_log::test;
use crate::Client;
use crate::RequestError;
#[test(tokio::test)]
async fn request_aapl_ticker() {
let client = Client::from_env().unwrap();
let result = client.issue::<Get>("AAPL".into()).await;
match result {
Ok(response) => {
let aapl = response.into_result().unwrap().ticker;
assert_eq!(aapl.ticker, "AAPL");
assert_eq!(aapl.name, "Apple Inc");
assert_eq!(aapl.market, Market::Stocks);
assert_eq!(aapl.locale, "US");
assert_eq!(aapl.currency, "USD");
},
Err(RequestError::Endpoint(GetError::NotFound(..))) => (),
Err(..) => panic!("unexpected error: {:?}", result),
}
}
}