From fb1b65e67b5fe38859d64798ca2b57fc44b6b82c Mon Sep 17 00:00:00 2001 From: Sam Beam Date: Tue, 15 Nov 2022 14:17:05 -0500 Subject: [PATCH] Pass vec of symbols to last_quote and last_trade requests --- examples/latest-quote-and-trade.rs | 8 ++++-- src/data/v2/last_quote.rs | 40 ++++++++++++++++++++---------- src/data/v2/last_trade.rs | 27 +++++++++++--------- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/examples/latest-quote-and-trade.rs b/examples/latest-quote-and-trade.rs index 6b2621f1..95e6bf5b 100644 --- a/examples/latest-quote-and-trade.rs +++ b/examples/latest-quote-and-trade.rs @@ -17,7 +17,7 @@ async fn main() { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let quote_req = last_quote::LastQuoteReq::new("AAPL,MSFT"); + let quote_req = last_quote::LastQuoteReq::new(vec!["AAPL".to_string(), "MSFT".to_string()]); let quotes = client.issue::("e_req).await.unwrap(); quotes.iter().for_each(|q| { println!( @@ -26,7 +26,11 @@ async fn main() { ) }); - let trade_req = last_trade::LastTradeRequest::new("SPY,QQQ,MSFT"); + let trade_req = last_trade::LastTradeRequest::new(vec![ + "SPY".to_string(), + "QQQ".to_string(), + "IWM".to_string(), + ]); let trades = client.issue::(&trade_req).await.unwrap(); trades.iter().for_each(|trade| { println!( diff --git a/src/data/v2/last_quote.rs b/src/data/v2/last_quote.rs index d3d62451..fbd0213a 100644 --- a/src/data/v2/last_quote.rs +++ b/src/data/v2/last_quote.rs @@ -27,15 +27,17 @@ pub struct LastQuoteReq { impl LastQuoteReq { /// Create a new LastQuoteReq with the given symbols. - pub fn new(symbols: S) -> Self - where - S: Into, - { + pub fn new(symbols: Vec) -> Self { Self { - symbols: symbols.into(), + symbols: symbols.join(",").into(), feed: None, } } + /// Set the data feed to use. + pub fn with_feed(mut self, feed: Feed) -> Self { + self.feed = Some(feed); + self + } } /// A quote bar as returned by the /v2/stocks/quotes/latest endpoint. @@ -196,7 +198,7 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastQuoteReq::new("SPY"); + let req = LastQuoteReq::new(vec!["SPY".to_string()]); let quotes = client.issue::(&req).await.unwrap(); // Just as a rough sanity check, we require that the reported time // is some time after two weeks before today. That should safely @@ -210,7 +212,11 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastQuoteReq::new("SPY,QQQ,MSFT"); + let req = LastQuoteReq::new(vec![ + "SPY".to_string(), + "QQQ".to_string(), + "MSFT".to_string(), + ]); let quotes = client.issue::(&req).await.unwrap(); assert_eq!(quotes.len(), 3); assert!(quotes[0].time >= Utc::now() - Duration::weeks(2)); @@ -222,10 +228,7 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastQuoteReq { - symbols: "SPY".to_string(), - feed: Some(Feed::SIP), - }; + let req = LastQuoteReq::new(vec!["SPY".to_string()]).with_feed(Feed::SIP); let result = client.issue::(&req).await; // Unfortunately we can't really know whether the user has the @@ -237,13 +240,24 @@ mod tests { } } - /// Bad symbol results in an error response from the server. + /// Non-existent symbol is skipped in the result. #[test(tokio::test)] async fn nonexistent_symbol() { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastQuoteReq::new("SPY,ABC123"); + let req = LastQuoteReq::new(vec!["SPY".to_string(), "NOSUCHSYMBOL".to_string()]); + let quotes = client.issue::(&req).await.unwrap(); + assert_eq!(quotes.len(), 1); + } + + /// Symbol with characters outside A-Z results in an error response from the server. + #[test(tokio::test)] + async fn bad_symbol() { + let api_info = ApiInfo::from_env().unwrap(); + let client = Client::new(api_info); + + let req = LastQuoteReq::new(vec!["ABC123".to_string()]); let err = client.issue::(&req).await.unwrap_err(); match err { RequestError::Endpoint(GetError::InvalidInput(_)) => (), diff --git a/src/data/v2/last_trade.rs b/src/data/v2/last_trade.rs index 2c2914da..9a215656 100644 --- a/src/data/v2/last_trade.rs +++ b/src/data/v2/last_trade.rs @@ -27,15 +27,17 @@ pub struct LastTradeRequest { impl LastTradeRequest { /// Create a new LastTradeRequest. - pub fn new(symbols: S) -> Self - where - S: Into, - { + pub fn new(symbols: Vec) -> Self { Self { - symbols: symbols.into(), + symbols: symbols.join(",").into(), feed: None, } } + /// Set the data feed to use. + pub fn with_feed(mut self, feed: Feed) -> Self { + self.feed = Some(feed); + self + } } /// A trade data point as returned by the /v2/stocks/{symbol}/trades/latest endpoint. @@ -182,7 +184,7 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastTradeRequest::new("SPY"); + let req = LastTradeRequest::new(vec!["SPY".to_string()]); let trades = client.issue::(&req).await.unwrap(); // Just as a rough sanity check, we require that the reported time // is some time after two weeks before today. That should safely @@ -198,7 +200,11 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastTradeRequest::new("SPY,QQQ,MSFT"); + let req = LastTradeRequest::new(vec![ + "SPY".to_string(), + "QQQ".to_string(), + "MSFT".to_string(), + ]); let trades = client.issue::(&req).await.unwrap(); assert_eq!(trades.len(), 3); assert!(trades[0].time >= Utc::now() - Duration::weeks(2)); @@ -211,10 +217,7 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastTradeRequest { - symbols: "SPY".to_string(), - feed: Some(Feed::SIP), - }; + let req = LastTradeRequest::new(vec!["SPY".to_string()]).with_feed(Feed::SIP); let result = client.issue::(&req).await; // Unfortunately we can't really know whether the user has the @@ -232,7 +235,7 @@ mod tests { let api_info = ApiInfo::from_env().unwrap(); let client = Client::new(api_info); - let req = LastTradeRequest::new("BZZZZZZT,AAPL"); + let req = LastTradeRequest::new(vec!["BZZZZZZT".to_string(), "AAPL".to_string()]); let trades = client.issue::(&req).await.unwrap(); assert_eq!(trades.len(), 1); }