use serde::Deserialize;
use crate::Str;
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Exchange {
#[serde(rename = "id")]
pub id: usize,
#[serde(rename = "type")]
pub type_: String,
#[serde(rename = "market")]
pub market: String,
#[serde(rename = "name")]
pub name: String,
pub code: Option<String>,
}
Endpoint! {
pub Get(()),
Ok => Vec<Exchange>, [
OK,
],
Err => GetError, []
fn path(_input: &Self::Input) -> Str {
"/v1/meta/exchanges".into()
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::from_str as from_json;
#[cfg(not(target_arch = "wasm32"))]
use test_log::test;
#[cfg(not(target_arch = "wasm32"))]
use crate::Client;
#[test]
fn parse_reference_exchanges() {
let response = r#"[
{
"id": 1,
"type": "exchange",
"market": "equities",
"mic": "XASE",
"name": "NYSE American (AMEX)",
"tape": "A"
},
{
"id": 2,
"type": "exchange",
"market": "equities",
"mic": "XBOS",
"name": "NASDAQ OMX BX",
"tape": "B"
},
{
"id": 15,
"type": "exchange",
"market": "equities",
"mic": "IEXG",
"name": "IEX",
"tape": "V"
},
{
"id": 16,
"type": "TRF",
"market": "equities",
"mic": "XCBO",
"name": "Chicago Board Options Exchange",
"tape": "W"
}
]"#;
let exchgs = from_json::<Vec<Exchange>>(response).unwrap();
assert_eq!(exchgs.len(), 4);
assert_eq!(exchgs[0].id, 1);
assert_eq!(exchgs[0].type_, "exchange");
assert_eq!(exchgs[0].market, "equities");
assert_eq!(exchgs[0].name, "NYSE American (AMEX)");
assert_eq!(exchgs[1].id, 2);
assert_eq!(exchgs[2].id, 15);
assert_eq!(exchgs[3].id, 16);
}
#[cfg(not(target_arch = "wasm32"))]
#[test(tokio::test)]
async fn request_exchanges() {
let client = Client::from_env().unwrap();
let exchgs = client.issue::<Get>(()).await.unwrap();
assert!(!exchgs.is_empty());
let nye = exchgs
.iter()
.find(|exchg| exchg.code.as_deref() == Some("NYE"))
.unwrap();
assert_eq!(nye.type_, "exchange");
assert_eq!(nye.market, "equities");
}
}