From 9b66dd016b9f277ca7638a74812f9cfc6d7ee405 Mon Sep 17 00:00:00 2001 From: Ryan Vacek Date: Sat, 9 Dec 2023 11:13:37 -0700 Subject: [PATCH] moves executables into bin folder --- {market-maker => bin/market-maker}/.gitignore | 0 {market-maker => bin/market-maker}/Cargo.lock | 0 {market-maker => bin/market-maker}/Cargo.toml | 0 {market-maker => bin/market-maker}/Dockerfile | 0 .../market-maker}/decision-maker/Cargo.lock | 0 .../market-maker}/decision-maker/Cargo.toml | 0 .../market-maker}/decision-maker/src/lib.rs | 0 .../market-maker}/exchange/Cargo.lock | 0 .../market-maker}/exchange/Cargo.toml | 0 .../market-maker}/exchange/src/lib.rs | 0 .../order-management-system/src/lib.rs | 0 bin/market-maker/proto-source/lib.rs | 323 ++++++++++++++++++ .../proto-source/proto-source/lib.rs | 323 ++++++++++++++++++ .../market-maker}/src/main.rs | 8 +- .../market-maker}/tools/grab-listen-key.py | 0 .../orderbook-quoter-server}/Cargo.lock | 0 .../orderbook-quoter-server}/Cargo.toml | 0 .../orderbook-quoter-server}/Dockerfile | 0 .../orderbook-quoter-server}/src/main.rs | 0 19 files changed, 651 insertions(+), 3 deletions(-) rename {market-maker => bin/market-maker}/.gitignore (100%) rename {market-maker => bin/market-maker}/Cargo.lock (100%) rename {market-maker => bin/market-maker}/Cargo.toml (100%) rename {market-maker => bin/market-maker}/Dockerfile (100%) rename {market-maker => bin/market-maker}/decision-maker/Cargo.lock (100%) rename {market-maker => bin/market-maker}/decision-maker/Cargo.toml (100%) rename {market-maker => bin/market-maker}/decision-maker/src/lib.rs (100%) rename {market-maker => bin/market-maker}/exchange/Cargo.lock (100%) rename {market-maker => bin/market-maker}/exchange/Cargo.toml (100%) rename {market-maker => bin/market-maker}/exchange/src/lib.rs (100%) rename {market-maker => bin/market-maker}/order-management-system/src/lib.rs (100%) create mode 100644 bin/market-maker/proto-source/lib.rs create mode 100644 bin/market-maker/proto-source/proto-source/lib.rs rename {market-maker => bin/market-maker}/src/main.rs (91%) rename {market-maker => bin/market-maker}/tools/grab-listen-key.py (100%) rename {orderbook-quoter-server => bin/orderbook-quoter-server}/Cargo.lock (100%) rename {orderbook-quoter-server => bin/orderbook-quoter-server}/Cargo.toml (100%) rename {orderbook-quoter-server => bin/orderbook-quoter-server}/Dockerfile (100%) rename {orderbook-quoter-server => bin/orderbook-quoter-server}/src/main.rs (100%) diff --git a/market-maker/.gitignore b/bin/market-maker/.gitignore similarity index 100% rename from market-maker/.gitignore rename to bin/market-maker/.gitignore diff --git a/market-maker/Cargo.lock b/bin/market-maker/Cargo.lock similarity index 100% rename from market-maker/Cargo.lock rename to bin/market-maker/Cargo.lock diff --git a/market-maker/Cargo.toml b/bin/market-maker/Cargo.toml similarity index 100% rename from market-maker/Cargo.toml rename to bin/market-maker/Cargo.toml diff --git a/market-maker/Dockerfile b/bin/market-maker/Dockerfile similarity index 100% rename from market-maker/Dockerfile rename to bin/market-maker/Dockerfile diff --git a/market-maker/decision-maker/Cargo.lock b/bin/market-maker/decision-maker/Cargo.lock similarity index 100% rename from market-maker/decision-maker/Cargo.lock rename to bin/market-maker/decision-maker/Cargo.lock diff --git a/market-maker/decision-maker/Cargo.toml b/bin/market-maker/decision-maker/Cargo.toml similarity index 100% rename from market-maker/decision-maker/Cargo.toml rename to bin/market-maker/decision-maker/Cargo.toml diff --git a/market-maker/decision-maker/src/lib.rs b/bin/market-maker/decision-maker/src/lib.rs similarity index 100% rename from market-maker/decision-maker/src/lib.rs rename to bin/market-maker/decision-maker/src/lib.rs diff --git a/market-maker/exchange/Cargo.lock b/bin/market-maker/exchange/Cargo.lock similarity index 100% rename from market-maker/exchange/Cargo.lock rename to bin/market-maker/exchange/Cargo.lock diff --git a/market-maker/exchange/Cargo.toml b/bin/market-maker/exchange/Cargo.toml similarity index 100% rename from market-maker/exchange/Cargo.toml rename to bin/market-maker/exchange/Cargo.toml diff --git a/market-maker/exchange/src/lib.rs b/bin/market-maker/exchange/src/lib.rs similarity index 100% rename from market-maker/exchange/src/lib.rs rename to bin/market-maker/exchange/src/lib.rs diff --git a/market-maker/order-management-system/src/lib.rs b/bin/market-maker/order-management-system/src/lib.rs similarity index 100% rename from market-maker/order-management-system/src/lib.rs rename to bin/market-maker/order-management-system/src/lib.rs diff --git a/bin/market-maker/proto-source/lib.rs b/bin/market-maker/proto-source/lib.rs new file mode 100644 index 0000000..8b0aaca --- /dev/null +++ b/bin/market-maker/proto-source/lib.rs @@ -0,0 +1,323 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QuoterRequest {} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Deal { + #[prost(int32, tag = "1")] + pub location: i32, + #[prost(double, tag = "2")] + pub price: f64, + #[prost(double, tag = "3")] + pub quantity: f64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QuoterResponse { + #[prost(int32, tag = "1")] + pub spread: i32, + #[prost(message, repeated, tag = "2")] + pub ask_deals: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "3")] + pub bid_deals: ::prost::alloc::vec::Vec, +} +/// Generated client implementations. +pub mod quoter_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct QuoterClient { + inner: tonic::client::Grpc, + } + impl QuoterClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl QuoterClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> QuoterClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + QuoterClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn server_streaming_quoter( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/lib.Quoter/ServerStreamingQuoter", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("lib.Quoter", "ServerStreamingQuoter")); + self.inner.server_streaming(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod quoter_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with QuoterServer. + #[async_trait] + pub trait Quoter: Send + Sync + 'static { + /// Server streaming response type for the ServerStreamingQuoter method. + type ServerStreamingQuoterStream: futures_core::Stream< + Item = std::result::Result, + > + + Send + + 'static; + async fn server_streaming_quoter( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct QuoterServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl QuoterServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for QuoterServer + where + T: Quoter, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/lib.Quoter/ServerStreamingQuoter" => { + #[allow(non_camel_case_types)] + struct ServerStreamingQuoterSvc(pub Arc); + impl< + T: Quoter, + > tonic::server::ServerStreamingService + for ServerStreamingQuoterSvc { + type Response = super::QuoterResponse; + type ResponseStream = T::ServerStreamingQuoterStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).server_streaming_quoter(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ServerStreamingQuoterSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for QuoterServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for QuoterServer { + const NAME: &'static str = "lib.Quoter"; + } +} diff --git a/bin/market-maker/proto-source/proto-source/lib.rs b/bin/market-maker/proto-source/proto-source/lib.rs new file mode 100644 index 0000000..8b0aaca --- /dev/null +++ b/bin/market-maker/proto-source/proto-source/lib.rs @@ -0,0 +1,323 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QuoterRequest {} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Deal { + #[prost(int32, tag = "1")] + pub location: i32, + #[prost(double, tag = "2")] + pub price: f64, + #[prost(double, tag = "3")] + pub quantity: f64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QuoterResponse { + #[prost(int32, tag = "1")] + pub spread: i32, + #[prost(message, repeated, tag = "2")] + pub ask_deals: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "3")] + pub bid_deals: ::prost::alloc::vec::Vec, +} +/// Generated client implementations. +pub mod quoter_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct QuoterClient { + inner: tonic::client::Grpc, + } + impl QuoterClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl QuoterClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> QuoterClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + QuoterClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn server_streaming_quoter( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/lib.Quoter/ServerStreamingQuoter", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("lib.Quoter", "ServerStreamingQuoter")); + self.inner.server_streaming(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod quoter_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with QuoterServer. + #[async_trait] + pub trait Quoter: Send + Sync + 'static { + /// Server streaming response type for the ServerStreamingQuoter method. + type ServerStreamingQuoterStream: futures_core::Stream< + Item = std::result::Result, + > + + Send + + 'static; + async fn server_streaming_quoter( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct QuoterServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl QuoterServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for QuoterServer + where + T: Quoter, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/lib.Quoter/ServerStreamingQuoter" => { + #[allow(non_camel_case_types)] + struct ServerStreamingQuoterSvc(pub Arc); + impl< + T: Quoter, + > tonic::server::ServerStreamingService + for ServerStreamingQuoterSvc { + type Response = super::QuoterResponse; + type ResponseStream = T::ServerStreamingQuoterStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).server_streaming_quoter(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ServerStreamingQuoterSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for QuoterServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for QuoterServer { + const NAME: &'static str = "lib.Quoter"; + } +} diff --git a/market-maker/src/main.rs b/bin/market-maker/src/main.rs similarity index 91% rename from market-maker/src/main.rs rename to bin/market-maker/src/main.rs index 1891549..6ae6307 100644 --- a/market-maker/src/main.rs +++ b/bin/market-maker/src/main.rs @@ -86,11 +86,13 @@ impl MarketMaker { .unwrap() .into_inner(); let mut stream = stream.take(num); + let mut counter = 0; while let Some(quote) = stream.next().await { let quote = quote.unwrap(); - println!("\treceived quote: {}", quote.spread); - println!("\treceived quote: {:?}", quote.ask_deals); - println!("\treceived quote: {:?}", quote.bid_deals); + println!("\t{} received quote: {}", counter, quote.spread); + println!("\t{} ASKS: {:?}", counter, quote.ask_deals); + println!("\t{} BIDS: {:?}", counter, quote.bid_deals); + counter = counter + 1; } } } diff --git a/market-maker/tools/grab-listen-key.py b/bin/market-maker/tools/grab-listen-key.py similarity index 100% rename from market-maker/tools/grab-listen-key.py rename to bin/market-maker/tools/grab-listen-key.py diff --git a/orderbook-quoter-server/Cargo.lock b/bin/orderbook-quoter-server/Cargo.lock similarity index 100% rename from orderbook-quoter-server/Cargo.lock rename to bin/orderbook-quoter-server/Cargo.lock diff --git a/orderbook-quoter-server/Cargo.toml b/bin/orderbook-quoter-server/Cargo.toml similarity index 100% rename from orderbook-quoter-server/Cargo.toml rename to bin/orderbook-quoter-server/Cargo.toml diff --git a/orderbook-quoter-server/Dockerfile b/bin/orderbook-quoter-server/Dockerfile similarity index 100% rename from orderbook-quoter-server/Dockerfile rename to bin/orderbook-quoter-server/Dockerfile diff --git a/orderbook-quoter-server/src/main.rs b/bin/orderbook-quoter-server/src/main.rs similarity index 100% rename from orderbook-quoter-server/src/main.rs rename to bin/orderbook-quoter-server/src/main.rs