diff --git a/1--transforming-sync-to-async/provided-code/Cargo.lock b/1--transforming-sync-to-async/provided-code/Cargo.lock index 3d6b30c..dadab9e 100644 --- a/1--transforming-sync-to-async/provided-code/Cargo.lock +++ b/1--transforming-sync-to-async/provided-code/Cargo.lock @@ -128,6 +128,17 @@ version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -661,6 +672,7 @@ name = "manning-lp-async-rust-project-1-m1" version = "0.1.0" dependencies = [ "async-std", + "async-trait", "chrono", "clap", "yahoo_finance_api", diff --git a/1--transforming-sync-to-async/provided-code/Cargo.toml b/1--transforming-sync-to-async/provided-code/Cargo.toml index 0ae30cc..a1714a2 100644 --- a/1--transforming-sync-to-async/provided-code/Cargo.toml +++ b/1--transforming-sync-to-async/provided-code/Cargo.toml @@ -10,4 +10,5 @@ version = "0.1.0" chrono = { version = "0.4", features = ["serde"] } clap = {version = "3.1.8", features = ["derive"]} yahoo_finance_api = "1.1" +async-trait = "0.1" async-std = { version = "1.6", features = ["attributes", "tokio1"] } diff --git a/1--transforming-sync-to-async/provided-code/src/main.rs b/1--transforming-sync-to-async/provided-code/src/main.rs index c2d8ed9..2019715 100644 --- a/1--transforming-sync-to-async/provided-code/src/main.rs +++ b/1--transforming-sync-to-async/provided-code/src/main.rs @@ -32,7 +32,7 @@ trait AsyncStockSignal { /// /// The signal (using the provided type) or `None` on error/invalid data. /// - fn calculate(&self, series: &[f64]) -> Option; + async fn calculate(&self, series: &[f64]) -> Option; } /// @@ -156,7 +156,7 @@ struct PriceDifference; impl AsyncStockSignal for PriceDifference { type SignalType = (f64, f64); - fn calculate(&self, series: &[f64]) -> Option { + async fn calculate(&self, series: &[f64]) -> Option { price_diff(series) } } @@ -165,7 +165,7 @@ struct MinPrice; impl AsyncStockSignal for MinPrice { type SignalType = f64; - fn calculate(&self, series: &[f64]) -> Option { + async fn calculate(&self, series: &[f64]) -> Option { min(series) } } @@ -174,7 +174,7 @@ struct MaxPrice; impl AsyncStockSignal for MaxPrice { type SignalType = f64; - fn calculate(&self, series: &[f64]) -> Option { + async fn calculate(&self, series: &[f64]) -> Option { max(series) } } @@ -185,7 +185,7 @@ struct WindowedSMA { impl AsyncStockSignal for WindowedSMA { type SignalType = Vec; - fn calculate(&self, series: &[f64]) -> Option { + async fn calculate(&self, series: &[f64]) -> Option { n_window_sma(self.window_size, series) } } @@ -195,68 +195,74 @@ mod tests { #![allow(non_snake_case)] use super::*; - #[test] - fn test_PriceDifference_calculate() { + #[async_std::test] + async fn test_PriceDifference_calculate() { let signal = PriceDifference {}; - assert_eq!(signal.calculate(&[]), None); - assert_eq!(signal.calculate(&[1.0]), Some((0.0, 0.0))); - assert_eq!(signal.calculate(&[1.0, 0.0]), Some((-1.0, -1.0))); + assert_eq!(signal.calculate(&[]).await, None); + assert_eq!(signal.calculate(&[1.0]).await, Some((0.0, 0.0))); + assert_eq!(signal.calculate(&[1.0, 0.0]).await, Some((-1.0, -1.0))); assert_eq!( - signal.calculate(&[2.0, 3.0, 5.0, 6.0, 1.0, 2.0, 10.0]), + signal + .calculate(&[2.0, 3.0, 5.0, 6.0, 1.0, 2.0, 10.0]) + .await, Some((8.0, 4.0)) ); assert_eq!( - signal.calculate(&[0.0, 3.0, 5.0, 6.0, 1.0, 2.0, 1.0]), + signal.calculate(&[0.0, 3.0, 5.0, 6.0, 1.0, 2.0, 1.0]).await, Some((1.0, 1.0)) ); } - #[test] - fn test_MinPrice_calculate() { + #[async_std::test] + async fn test_MinPrice_calculate() { let signal = MinPrice {}; - assert_eq!(signal.calculate(&[]), None); - assert_eq!(signal.calculate(&[1.0]), Some(1.0)); - assert_eq!(signal.calculate(&[1.0, 0.0]), Some(0.0)); + assert_eq!(signal.calculate(&[]).await, None); + assert_eq!(signal.calculate(&[1.0]).await, Some(1.0)); + assert_eq!(signal.calculate(&[1.0, 0.0]).await, Some(0.0)); assert_eq!( - signal.calculate(&[2.0, 3.0, 5.0, 6.0, 1.0, 2.0, 10.0]), + signal + .calculate(&[2.0, 3.0, 5.0, 6.0, 1.0, 2.0, 10.0]) + .await, Some(1.0) ); assert_eq!( - signal.calculate(&[0.0, 3.0, 5.0, 6.0, 1.0, 2.0, 1.0]), + signal.calculate(&[0.0, 3.0, 5.0, 6.0, 1.0, 2.0, 1.0]).await, Some(0.0) ); } - #[test] - fn test_MaxPrice_calculate() { + #[async_std::test] + async fn test_MaxPrice_calculate() { let signal = MaxPrice {}; - assert_eq!(signal.calculate(&[]), None); - assert_eq!(signal.calculate(&[1.0]), Some(1.0)); - assert_eq!(signal.calculate(&[1.0, 0.0]), Some(1.0)); + assert_eq!(signal.calculate(&[]).await, None); + assert_eq!(signal.calculate(&[1.0]).await, Some(1.0)); + assert_eq!(signal.calculate(&[1.0, 0.0]).await, Some(1.0)); assert_eq!( - signal.calculate(&[2.0, 3.0, 5.0, 6.0, 1.0, 2.0, 10.0]), + signal + .calculate(&[2.0, 3.0, 5.0, 6.0, 1.0, 2.0, 10.0]) + .await, Some(10.0) ); assert_eq!( - signal.calculate(&[0.0, 3.0, 5.0, 6.0, 1.0, 2.0, 1.0]), + signal.calculate(&[0.0, 3.0, 5.0, 6.0, 1.0, 2.0, 1.0]).await, Some(6.0) ); } - #[test] - fn test_WindowedSMA_calculate() { + #[async_std::test] + async fn test_WindowedSMA_calculate() { let series = vec![2.0, 4.5, 5.3, 6.5, 4.7]; let signal = WindowedSMA { window_size: 3 }; assert_eq!( - signal.calculate(&series), + signal.calculate(&series).await, Some(vec![3.9333333333333336, 5.433333333333334, 5.5]) ); let signal = WindowedSMA { window_size: 5 }; - assert_eq!(signal.calculate(&series), Some(vec![4.6])); + assert_eq!(signal.calculate(&series).await, Some(vec![4.6])); let signal = WindowedSMA { window_size: 10 }; - assert_eq!(signal.calculate(&series), Some(vec![])); + assert_eq!(signal.calculate(&series).await, Some(vec![])); } }