From 4c09b629f9db39c23134c6a65cf2077f36b8895f Mon Sep 17 00:00:00 2001 From: William Chargin Date: Wed, 14 Apr 2021 14:11:40 -0700 Subject: [PATCH 1/3] rust: add `tonic-reflection` dependency Summary: The [`tonic-reflection`] crate implements the gRPC reflection protocol, and will enable us to significantly simplify `grpc_cli` usage. Reflection was released in Tonic v0.4.1, so this patch also upgrades the rest of our Tonic stack to the latest versions. Test Plan: It builds: `bazel build //tensorboard/data/server/cargo:tonic_reflection`. wchargin-branch: rust-dep-tonic-reflection wchargin-source: 2a449d629fc231d697c82171c413000f1f09e645 --- tensorboard/data/server/Cargo.lock | 34 +++++-- tensorboard/data/server/Cargo.toml | 14 ++- tensorboard/data/server/cargo/BUILD.bazel | 13 ++- .../data/server/tensorboard.data.pb.rs | 2 +- third_party/rust/crates.bzl | 50 ++++++---- third_party/rust/remote/BUILD.h2-0.3.0.bazel | 2 +- ...6.1.bazel => BUILD.tokio-util-0.6.6.bazel} | 9 +- ...ic-0.4.0.bazel => BUILD.tonic-0.4.2.bazel} | 6 +- ....0.bazel => BUILD.tonic-build-0.4.2.bazel} | 2 +- .../remote/BUILD.tonic-reflection-0.1.0.bazel | 95 +++++++++++++++++++ ...er-0.4.3.bazel => BUILD.tower-0.4.6.bazel} | 5 +- 11 files changed, 190 insertions(+), 42 deletions(-) rename third_party/rust/remote/{BUILD.tokio-util-0.6.1.bazel => BUILD.tokio-util-0.6.6.bazel} (90%) rename third_party/rust/remote/{BUILD.tonic-0.4.0.bazel => BUILD.tonic-0.4.2.bazel} (95%) rename third_party/rust/remote/{BUILD.tonic-build-0.4.0.bazel => BUILD.tonic-build-0.4.2.bazel} (98%) create mode 100644 third_party/rust/remote/BUILD.tonic-reflection-0.1.0.bazel rename third_party/rust/remote/{BUILD.tower-0.4.3.bazel => BUILD.tower-0.4.6.bazel} (95%) diff --git a/tensorboard/data/server/Cargo.lock b/tensorboard/data/server/Cargo.lock index fb54f22d69f..e86558cb5b1 100644 --- a/tensorboard/data/server/Cargo.lock +++ b/tensorboard/data/server/Cargo.lock @@ -1108,6 +1108,7 @@ dependencies = [ "tokio-stream", "tonic", "tonic-build", + "tonic-reflection", "walkdir", ] @@ -1369,9 +1370,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.1" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ae4751faa60b9f96dd8344d74592e5a17c0c9a220413dbc6942d14139bbfcc" +checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e" dependencies = [ "bytes 1.0.1", "futures-core", @@ -1379,14 +1380,13 @@ dependencies = [ "log", "pin-project-lite 0.2.4", "tokio", - "tokio-stream", ] [[package]] name = "tonic" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ba8f479158947373b6df40cf48f4779bb25c99ca3c661bd95e0ab1963ad8b0e" +checksum = "556dc31b450f45d18279cfc3d2519280273f460d5387e6b7b24503e65d206f8b" dependencies = [ "async-stream", "async-trait", @@ -1413,9 +1413,9 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e8546fd40d56d28089835c0a81bb396848103b00f888aea42d46eb5974df07" +checksum = "c695de27302f4697191dda1c7178131a8cb805463dda02864acb80fe1322fdcf" dependencies = [ "proc-macro2", "prost-build", @@ -1423,11 +1423,26 @@ dependencies = [ "syn", ] +[[package]] +name = "tonic-reflection" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56498d20188550337ea6c48ecf59d11646382dbfcd61051fb98c1093cfae3c21" +dependencies = [ + "bytes 1.0.1", + "prost", + "prost-types", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", +] + [[package]] name = "tower" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855703d368d4c9321ccc1efe1b0fe436c3f20b102b25060707ebe6b4502bdefb" +checksum = "f715efe02c0862926eb463e49368d38ddb119383475686178e32e26d15d06a66" dependencies = [ "futures-core", "futures-util", @@ -1437,6 +1452,7 @@ dependencies = [ "slab", "tokio", "tokio-stream", + "tokio-util", "tower-layer", "tower-service", "tracing", diff --git a/tensorboard/data/server/Cargo.toml b/tensorboard/data/server/Cargo.toml index 439d1d2548e..7210010871c 100644 --- a/tensorboard/data/server/Cargo.toml +++ b/tensorboard/data/server/Cargo.toml @@ -46,13 +46,14 @@ serde_json = "1.0.59" thiserror = "1.0.21" tokio = { version = "1.0.2", features = ["macros", "rt-multi-thread"] } tokio-stream = { version = "0.1.2", features = ["net"] } -tonic = "0.4.0" +tonic = "0.4.2" +tonic-reflection = "0.1.0" walkdir = "2.3.1" [dev-dependencies] prost-build = "0.7.0" tempfile = "3.1.0" -tonic-build = "0.4.0" +tonic-build = "0.4.2" [[bin]] name = "rustboard" @@ -113,3 +114,12 @@ additional_flags = [ [package.metadata.raze.crates.prost-build.'0.7.0'] gen_buildrs = true + +[package.metadata.raze.crates.tonic-reflection.'0.1.0'] +gen_buildrs = true +build_data_dependencies = ["@com_google_protobuf//:protoc"] + +[package.metadata.raze.crates.tonic-reflection.'0.1.0'.buildrs_additional_environment_variables] +PROTOC = "$(execpath @com_google_protobuf//:protoc)" +# we don't have easy access to a rustfmt binary, so make it a no-op +RUSTFMT = "/bin/true" diff --git a/tensorboard/data/server/cargo/BUILD.bazel b/tensorboard/data/server/cargo/BUILD.bazel index 865c89542b1..d827150fad7 100644 --- a/tensorboard/data/server/cargo/BUILD.bazel +++ b/tensorboard/data/server/cargo/BUILD.bazel @@ -230,7 +230,7 @@ alias( alias( name = "tonic", - actual = "@raze__tonic__0_4_0//:tonic", + actual = "@raze__tonic__0_4_2//:tonic", tags = [ "cargo-raze", "manual", @@ -239,7 +239,16 @@ alias( alias( name = "tonic_build", - actual = "@raze__tonic_build__0_4_0//:tonic_build", + actual = "@raze__tonic_build__0_4_2//:tonic_build", + tags = [ + "cargo-raze", + "manual", + ], +) + +alias( + name = "tonic_reflection", + actual = "@raze__tonic_reflection__0_1_0//:tonic_reflection", tags = [ "cargo-raze", "manual", diff --git a/tensorboard/data/server/tensorboard.data.pb.rs b/tensorboard/data/server/tensorboard.data.pb.rs index 9d4fb199aef..2cc00a686c1 100644 --- a/tensorboard/data/server/tensorboard.data.pb.rs +++ b/tensorboard/data/server/tensorboard.data.pb.rs @@ -459,4 +459,4 @@ pub struct ReadBlobResponse { #[prost(bytes="bytes", tag="1")] pub data: ::prost::bytes::Bytes, } -# [doc = r" Generated client implementations."] pub mod tensor_board_data_provider_client { # ! [allow (unused_variables , dead_code , missing_docs)] use tonic :: codegen :: * ; pub struct TensorBoardDataProviderClient < T > { inner : tonic :: client :: Grpc < T > , } impl TensorBoardDataProviderClient < tonic :: transport :: Channel > { # [doc = r" Attempt to create a new client by connecting to a given endpoint."] pub async fn connect < D > (dst : D) -> Result < Self , tonic :: transport :: Error > where D : std :: convert :: TryInto < tonic :: transport :: Endpoint > , D :: Error : Into < StdError > , { let conn = tonic :: transport :: Endpoint :: new (dst) ? . connect () . await ? ; Ok (Self :: new (conn)) } } impl < T > TensorBoardDataProviderClient < T > where T : tonic :: client :: GrpcService < tonic :: body :: BoxBody > , T :: ResponseBody : Body + HttpBody + Send + 'static , T :: Error : Into < StdError > , < T :: ResponseBody as HttpBody > :: Error : Into < StdError > + Send , { pub fn new (inner : T) -> Self { let inner = tonic :: client :: Grpc :: new (inner) ; Self { inner } } pub fn with_interceptor (inner : T , interceptor : impl Into < tonic :: Interceptor >) -> Self { let inner = tonic :: client :: Grpc :: with_interceptor (inner , interceptor) ; Self { inner } } # [doc = " Get metadata about an experiment."] pub async fn get_experiment (& mut self , request : impl tonic :: IntoRequest < super :: GetExperimentRequest > ,) -> Result < tonic :: Response < super :: GetExperimentResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/GetExperiment") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List plugins that have data for an experiment."] pub async fn list_plugins (& mut self , request : impl tonic :: IntoRequest < super :: ListPluginsRequest > ,) -> Result < tonic :: Response < super :: ListPluginsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListPlugins") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List runs within an experiment."] pub async fn list_runs (& mut self , request : impl tonic :: IntoRequest < super :: ListRunsRequest > ,) -> Result < tonic :: Response < super :: ListRunsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListRuns") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List metadata about scalar time series."] pub async fn list_scalars (& mut self , request : impl tonic :: IntoRequest < super :: ListScalarsRequest > ,) -> Result < tonic :: Response < super :: ListScalarsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListScalars") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read data from scalar time series."] pub async fn read_scalars (& mut self , request : impl tonic :: IntoRequest < super :: ReadScalarsRequest > ,) -> Result < tonic :: Response < super :: ReadScalarsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadScalars") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List metadata about tensor time series."] pub async fn list_tensors (& mut self , request : impl tonic :: IntoRequest < super :: ListTensorsRequest > ,) -> Result < tonic :: Response < super :: ListTensorsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListTensors") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read data from tensor time series."] pub async fn read_tensors (& mut self , request : impl tonic :: IntoRequest < super :: ReadTensorsRequest > ,) -> Result < tonic :: Response < super :: ReadTensorsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadTensors") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List metadata about blob sequence time series."] pub async fn list_blob_sequences (& mut self , request : impl tonic :: IntoRequest < super :: ListBlobSequencesRequest > ,) -> Result < tonic :: Response < super :: ListBlobSequencesResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListBlobSequences") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read blob references from blob sequence time series. See `ReadBlob` to read"] # [doc = " the actual blob data."] pub async fn read_blob_sequences (& mut self , request : impl tonic :: IntoRequest < super :: ReadBlobSequencesRequest > ,) -> Result < tonic :: Response < super :: ReadBlobSequencesResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadBlobSequences") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read data for a specific blob."] pub async fn read_blob (& mut self , request : impl tonic :: IntoRequest < super :: ReadBlobRequest > ,) -> Result < tonic :: Response < tonic :: codec :: Streaming < super :: ReadBlobResponse >> , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadBlob") ; self . inner . server_streaming (request . into_request () , path , codec) . await } } impl < T : Clone > Clone for TensorBoardDataProviderClient < T > { fn clone (& self) -> Self { Self { inner : self . inner . clone () , } } } impl < T > std :: fmt :: Debug for TensorBoardDataProviderClient < T > { fn fmt (& self , f : & mut std :: fmt :: Formatter < '_ >) -> std :: fmt :: Result { write ! (f , "TensorBoardDataProviderClient {{ ... }}") } } }# [doc = r" Generated server implementations."] pub mod tensor_board_data_provider_server { # ! [allow (unused_variables , dead_code , missing_docs)] use tonic :: codegen :: * ; # [doc = "Generated trait containing gRPC methods that should be implemented for use with TensorBoardDataProviderServer."] # [async_trait] pub trait TensorBoardDataProvider : Send + Sync + 'static { # [doc = " Get metadata about an experiment."] async fn get_experiment (& self , request : tonic :: Request < super :: GetExperimentRequest >) -> Result < tonic :: Response < super :: GetExperimentResponse > , tonic :: Status > ; # [doc = " List plugins that have data for an experiment."] async fn list_plugins (& self , request : tonic :: Request < super :: ListPluginsRequest >) -> Result < tonic :: Response < super :: ListPluginsResponse > , tonic :: Status > ; # [doc = " List runs within an experiment."] async fn list_runs (& self , request : tonic :: Request < super :: ListRunsRequest >) -> Result < tonic :: Response < super :: ListRunsResponse > , tonic :: Status > ; # [doc = " List metadata about scalar time series."] async fn list_scalars (& self , request : tonic :: Request < super :: ListScalarsRequest >) -> Result < tonic :: Response < super :: ListScalarsResponse > , tonic :: Status > ; # [doc = " Read data from scalar time series."] async fn read_scalars (& self , request : tonic :: Request < super :: ReadScalarsRequest >) -> Result < tonic :: Response < super :: ReadScalarsResponse > , tonic :: Status > ; # [doc = " List metadata about tensor time series."] async fn list_tensors (& self , request : tonic :: Request < super :: ListTensorsRequest >) -> Result < tonic :: Response < super :: ListTensorsResponse > , tonic :: Status > ; # [doc = " Read data from tensor time series."] async fn read_tensors (& self , request : tonic :: Request < super :: ReadTensorsRequest >) -> Result < tonic :: Response < super :: ReadTensorsResponse > , tonic :: Status > ; # [doc = " List metadata about blob sequence time series."] async fn list_blob_sequences (& self , request : tonic :: Request < super :: ListBlobSequencesRequest >) -> Result < tonic :: Response < super :: ListBlobSequencesResponse > , tonic :: Status > ; # [doc = " Read blob references from blob sequence time series. See `ReadBlob` to read"] # [doc = " the actual blob data."] async fn read_blob_sequences (& self , request : tonic :: Request < super :: ReadBlobSequencesRequest >) -> Result < tonic :: Response < super :: ReadBlobSequencesResponse > , tonic :: Status > ; # [doc = "Server streaming response type for the ReadBlob method."] type ReadBlobStream : Stream < Item = Result < super :: ReadBlobResponse , tonic :: Status >> + Send + Sync + 'static ; # [doc = " Read data for a specific blob."] async fn read_blob (& self , request : tonic :: Request < super :: ReadBlobRequest >) -> Result < tonic :: Response < Self :: ReadBlobStream > , tonic :: Status > ; } # [derive (Debug)] pub struct TensorBoardDataProviderServer < T : TensorBoardDataProvider > { inner : _Inner < T > , } struct _Inner < T > (Arc < T > , Option < tonic :: Interceptor >) ; impl < T : TensorBoardDataProvider > TensorBoardDataProviderServer < T > { pub fn new (inner : T) -> Self { let inner = Arc :: new (inner) ; let inner = _Inner (inner , None) ; Self { inner } } pub fn with_interceptor (inner : T , interceptor : impl Into < tonic :: Interceptor >) -> Self { let inner = Arc :: new (inner) ; let inner = _Inner (inner , Some (interceptor . into ())) ; Self { inner } } } impl < T , B > Service < http :: Request < B >> for TensorBoardDataProviderServer < T > where T : TensorBoardDataProvider , B : HttpBody + Send + Sync + 'static , B :: Error : Into < StdError > + Send + 'static , { type Response = http :: Response < tonic :: body :: BoxBody > ; type Error = Never ; type Future = BoxFuture < Self :: Response , Self :: Error > ; fn poll_ready (& mut self , _cx : & mut Context < '_ >) -> Poll < Result < () , Self :: Error >> { Poll :: Ready (Ok (())) } fn call (& mut self , req : http :: Request < B >) -> Self :: Future { let inner = self . inner . clone () ; match req . uri () . path () { "/tensorboard.data.TensorBoardDataProvider/GetExperiment" => { # [allow (non_camel_case_types)] struct GetExperimentSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: GetExperimentRequest > for GetExperimentSvc < T > { type Response = super :: GetExperimentResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: GetExperimentRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . get_experiment (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = GetExperimentSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListPlugins" => { # [allow (non_camel_case_types)] struct ListPluginsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListPluginsRequest > for ListPluginsSvc < T > { type Response = super :: ListPluginsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListPluginsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_plugins (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListPluginsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListRuns" => { # [allow (non_camel_case_types)] struct ListRunsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListRunsRequest > for ListRunsSvc < T > { type Response = super :: ListRunsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListRunsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_runs (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListRunsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListScalars" => { # [allow (non_camel_case_types)] struct ListScalarsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListScalarsRequest > for ListScalarsSvc < T > { type Response = super :: ListScalarsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListScalarsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_scalars (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListScalarsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadScalars" => { # [allow (non_camel_case_types)] struct ReadScalarsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ReadScalarsRequest > for ReadScalarsSvc < T > { type Response = super :: ReadScalarsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadScalarsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_scalars (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ReadScalarsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListTensors" => { # [allow (non_camel_case_types)] struct ListTensorsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListTensorsRequest > for ListTensorsSvc < T > { type Response = super :: ListTensorsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListTensorsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_tensors (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListTensorsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadTensors" => { # [allow (non_camel_case_types)] struct ReadTensorsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ReadTensorsRequest > for ReadTensorsSvc < T > { type Response = super :: ReadTensorsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadTensorsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_tensors (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ReadTensorsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListBlobSequences" => { # [allow (non_camel_case_types)] struct ListBlobSequencesSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListBlobSequencesRequest > for ListBlobSequencesSvc < T > { type Response = super :: ListBlobSequencesResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListBlobSequencesRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_blob_sequences (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListBlobSequencesSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadBlobSequences" => { # [allow (non_camel_case_types)] struct ReadBlobSequencesSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ReadBlobSequencesRequest > for ReadBlobSequencesSvc < T > { type Response = super :: ReadBlobSequencesResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadBlobSequencesRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_blob_sequences (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ReadBlobSequencesSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadBlob" => { # [allow (non_camel_case_types)] struct ReadBlobSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: ServerStreamingService < super :: ReadBlobRequest > for ReadBlobSvc < T > { type Response = super :: ReadBlobResponse ; type ResponseStream = T :: ReadBlobStream ; type Future = BoxFuture < tonic :: Response < Self :: ResponseStream > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadBlobRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_blob (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 ; let inner = inner . 0 ; let method = ReadBlobSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; 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 (tonic :: body :: BoxBody :: empty ()) . unwrap ()) }) , } } } impl < T : TensorBoardDataProvider > Clone for TensorBoardDataProviderServer < T > { fn clone (& self) -> Self { let inner = self . inner . clone () ; Self { inner } } } impl < T : TensorBoardDataProvider > Clone for _Inner < T > { fn clone (& self) -> Self { Self (self . 0 . clone () , self . 1 . clone ()) } } impl < T : std :: fmt :: Debug > std :: fmt :: Debug for _Inner < T > { fn fmt (& self , f : & mut std :: fmt :: Formatter < '_ >) -> std :: fmt :: Result { write ! (f , "{:?}" , self . 0) } } impl < T : TensorBoardDataProvider > tonic :: transport :: NamedService for TensorBoardDataProviderServer < T > { const NAME : & 'static str = "tensorboard.data.TensorBoardDataProvider" ; } } \ No newline at end of file +# [doc = r" Generated client implementations."] pub mod tensor_board_data_provider_client { # ! [allow (unused_variables , dead_code , missing_docs)] use tonic :: codegen :: * ; pub struct TensorBoardDataProviderClient < T > { inner : tonic :: client :: Grpc < T > , } impl TensorBoardDataProviderClient < tonic :: transport :: Channel > { # [doc = r" Attempt to create a new client by connecting to a given endpoint."] pub async fn connect < D > (dst : D) -> Result < Self , tonic :: transport :: Error > where D : std :: convert :: TryInto < tonic :: transport :: Endpoint > , D :: Error : Into < StdError > , { let conn = tonic :: transport :: Endpoint :: new (dst) ? . connect () . await ? ; Ok (Self :: new (conn)) } } impl < T > TensorBoardDataProviderClient < T > where T : tonic :: client :: GrpcService < tonic :: body :: BoxBody > , T :: ResponseBody : Body + HttpBody + Send + 'static , T :: Error : Into < StdError > , < T :: ResponseBody as HttpBody > :: Error : Into < StdError > + Send , { pub fn new (inner : T) -> Self { let inner = tonic :: client :: Grpc :: new (inner) ; Self { inner } } pub fn with_interceptor (inner : T , interceptor : impl Into < tonic :: Interceptor >) -> Self { let inner = tonic :: client :: Grpc :: with_interceptor (inner , interceptor) ; Self { inner } } # [doc = " Get metadata about an experiment."] pub async fn get_experiment (& mut self , request : impl tonic :: IntoRequest < super :: GetExperimentRequest > ,) -> Result < tonic :: Response < super :: GetExperimentResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/GetExperiment") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List plugins that have data for an experiment."] pub async fn list_plugins (& mut self , request : impl tonic :: IntoRequest < super :: ListPluginsRequest > ,) -> Result < tonic :: Response < super :: ListPluginsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListPlugins") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List runs within an experiment."] pub async fn list_runs (& mut self , request : impl tonic :: IntoRequest < super :: ListRunsRequest > ,) -> Result < tonic :: Response < super :: ListRunsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListRuns") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List metadata about scalar time series."] pub async fn list_scalars (& mut self , request : impl tonic :: IntoRequest < super :: ListScalarsRequest > ,) -> Result < tonic :: Response < super :: ListScalarsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListScalars") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read data from scalar time series."] pub async fn read_scalars (& mut self , request : impl tonic :: IntoRequest < super :: ReadScalarsRequest > ,) -> Result < tonic :: Response < super :: ReadScalarsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadScalars") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List metadata about tensor time series."] pub async fn list_tensors (& mut self , request : impl tonic :: IntoRequest < super :: ListTensorsRequest > ,) -> Result < tonic :: Response < super :: ListTensorsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListTensors") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read data from tensor time series."] pub async fn read_tensors (& mut self , request : impl tonic :: IntoRequest < super :: ReadTensorsRequest > ,) -> Result < tonic :: Response < super :: ReadTensorsResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadTensors") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " List metadata about blob sequence time series."] pub async fn list_blob_sequences (& mut self , request : impl tonic :: IntoRequest < super :: ListBlobSequencesRequest > ,) -> Result < tonic :: Response < super :: ListBlobSequencesResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ListBlobSequences") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read blob references from blob sequence time series. See `ReadBlob` to read"] # [doc = " the actual blob data."] pub async fn read_blob_sequences (& mut self , request : impl tonic :: IntoRequest < super :: ReadBlobSequencesRequest > ,) -> Result < tonic :: Response < super :: ReadBlobSequencesResponse > , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadBlobSequences") ; self . inner . unary (request . into_request () , path , codec) . await } # [doc = " Read data for a specific blob."] pub async fn read_blob (& mut self , request : impl tonic :: IntoRequest < super :: ReadBlobRequest > ,) -> Result < tonic :: Response < tonic :: codec :: Streaming < super :: ReadBlobResponse >> , 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 ("/tensorboard.data.TensorBoardDataProvider/ReadBlob") ; self . inner . server_streaming (request . into_request () , path , codec) . await } } impl < T : Clone > Clone for TensorBoardDataProviderClient < T > { fn clone (& self) -> Self { Self { inner : self . inner . clone () , } } } impl < T > std :: fmt :: Debug for TensorBoardDataProviderClient < T > { fn fmt (& self , f : & mut std :: fmt :: Formatter < '_ >) -> std :: fmt :: Result { write ! (f , "TensorBoardDataProviderClient {{ ... }}") } } }# [doc = r" Generated server implementations."] pub mod tensor_board_data_provider_server { # ! [allow (unused_variables , dead_code , missing_docs)] use tonic :: codegen :: * ; # [doc = "Generated trait containing gRPC methods that should be implemented for use with TensorBoardDataProviderServer."] # [async_trait] pub trait TensorBoardDataProvider : Send + Sync + 'static { # [doc = " Get metadata about an experiment."] async fn get_experiment (& self , request : tonic :: Request < super :: GetExperimentRequest >) -> Result < tonic :: Response < super :: GetExperimentResponse > , tonic :: Status > ; # [doc = " List plugins that have data for an experiment."] async fn list_plugins (& self , request : tonic :: Request < super :: ListPluginsRequest >) -> Result < tonic :: Response < super :: ListPluginsResponse > , tonic :: Status > ; # [doc = " List runs within an experiment."] async fn list_runs (& self , request : tonic :: Request < super :: ListRunsRequest >) -> Result < tonic :: Response < super :: ListRunsResponse > , tonic :: Status > ; # [doc = " List metadata about scalar time series."] async fn list_scalars (& self , request : tonic :: Request < super :: ListScalarsRequest >) -> Result < tonic :: Response < super :: ListScalarsResponse > , tonic :: Status > ; # [doc = " Read data from scalar time series."] async fn read_scalars (& self , request : tonic :: Request < super :: ReadScalarsRequest >) -> Result < tonic :: Response < super :: ReadScalarsResponse > , tonic :: Status > ; # [doc = " List metadata about tensor time series."] async fn list_tensors (& self , request : tonic :: Request < super :: ListTensorsRequest >) -> Result < tonic :: Response < super :: ListTensorsResponse > , tonic :: Status > ; # [doc = " Read data from tensor time series."] async fn read_tensors (& self , request : tonic :: Request < super :: ReadTensorsRequest >) -> Result < tonic :: Response < super :: ReadTensorsResponse > , tonic :: Status > ; # [doc = " List metadata about blob sequence time series."] async fn list_blob_sequences (& self , request : tonic :: Request < super :: ListBlobSequencesRequest >) -> Result < tonic :: Response < super :: ListBlobSequencesResponse > , tonic :: Status > ; # [doc = " Read blob references from blob sequence time series. See `ReadBlob` to read"] # [doc = " the actual blob data."] async fn read_blob_sequences (& self , request : tonic :: Request < super :: ReadBlobSequencesRequest >) -> Result < tonic :: Response < super :: ReadBlobSequencesResponse > , tonic :: Status > ; # [doc = "Server streaming response type for the ReadBlob method."] type ReadBlobStream : futures_core :: Stream < Item = Result < super :: ReadBlobResponse , tonic :: Status >> + Send + Sync + 'static ; # [doc = " Read data for a specific blob."] async fn read_blob (& self , request : tonic :: Request < super :: ReadBlobRequest >) -> Result < tonic :: Response < Self :: ReadBlobStream > , tonic :: Status > ; } # [derive (Debug)] pub struct TensorBoardDataProviderServer < T : TensorBoardDataProvider > { inner : _Inner < T > , } struct _Inner < T > (Arc < T > , Option < tonic :: Interceptor >) ; impl < T : TensorBoardDataProvider > TensorBoardDataProviderServer < T > { pub fn new (inner : T) -> Self { let inner = Arc :: new (inner) ; let inner = _Inner (inner , None) ; Self { inner } } pub fn with_interceptor (inner : T , interceptor : impl Into < tonic :: Interceptor >) -> Self { let inner = Arc :: new (inner) ; let inner = _Inner (inner , Some (interceptor . into ())) ; Self { inner } } } impl < T , B > Service < http :: Request < B >> for TensorBoardDataProviderServer < T > where T : TensorBoardDataProvider , B : HttpBody + Send + Sync + 'static , B :: Error : Into < StdError > + Send + 'static , { type Response = http :: Response < tonic :: body :: BoxBody > ; type Error = Never ; type Future = BoxFuture < Self :: Response , Self :: Error > ; fn poll_ready (& mut self , _cx : & mut Context < '_ >) -> Poll < Result < () , Self :: Error >> { Poll :: Ready (Ok (())) } fn call (& mut self , req : http :: Request < B >) -> Self :: Future { let inner = self . inner . clone () ; match req . uri () . path () { "/tensorboard.data.TensorBoardDataProvider/GetExperiment" => { # [allow (non_camel_case_types)] struct GetExperimentSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: GetExperimentRequest > for GetExperimentSvc < T > { type Response = super :: GetExperimentResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: GetExperimentRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . get_experiment (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = GetExperimentSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListPlugins" => { # [allow (non_camel_case_types)] struct ListPluginsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListPluginsRequest > for ListPluginsSvc < T > { type Response = super :: ListPluginsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListPluginsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_plugins (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListPluginsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListRuns" => { # [allow (non_camel_case_types)] struct ListRunsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListRunsRequest > for ListRunsSvc < T > { type Response = super :: ListRunsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListRunsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_runs (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListRunsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListScalars" => { # [allow (non_camel_case_types)] struct ListScalarsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListScalarsRequest > for ListScalarsSvc < T > { type Response = super :: ListScalarsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListScalarsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_scalars (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListScalarsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadScalars" => { # [allow (non_camel_case_types)] struct ReadScalarsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ReadScalarsRequest > for ReadScalarsSvc < T > { type Response = super :: ReadScalarsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadScalarsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_scalars (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ReadScalarsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListTensors" => { # [allow (non_camel_case_types)] struct ListTensorsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListTensorsRequest > for ListTensorsSvc < T > { type Response = super :: ListTensorsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListTensorsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_tensors (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListTensorsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadTensors" => { # [allow (non_camel_case_types)] struct ReadTensorsSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ReadTensorsRequest > for ReadTensorsSvc < T > { type Response = super :: ReadTensorsResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadTensorsRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_tensors (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ReadTensorsSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ListBlobSequences" => { # [allow (non_camel_case_types)] struct ListBlobSequencesSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ListBlobSequencesRequest > for ListBlobSequencesSvc < T > { type Response = super :: ListBlobSequencesResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ListBlobSequencesRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . list_blob_sequences (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ListBlobSequencesSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadBlobSequences" => { # [allow (non_camel_case_types)] struct ReadBlobSequencesSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: UnaryService < super :: ReadBlobSequencesRequest > for ReadBlobSequencesSvc < T > { type Response = super :: ReadBlobSequencesResponse ; type Future = BoxFuture < tonic :: Response < Self :: Response > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadBlobSequencesRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_blob_sequences (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 . clone () ; let inner = inner . 0 ; let method = ReadBlobSequencesSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; let res = grpc . unary (method , req) . await ; Ok (res) } ; Box :: pin (fut) } "/tensorboard.data.TensorBoardDataProvider/ReadBlob" => { # [allow (non_camel_case_types)] struct ReadBlobSvc < T : TensorBoardDataProvider > (pub Arc < T >) ; impl < T : TensorBoardDataProvider > tonic :: server :: ServerStreamingService < super :: ReadBlobRequest > for ReadBlobSvc < T > { type Response = super :: ReadBlobResponse ; type ResponseStream = T :: ReadBlobStream ; type Future = BoxFuture < tonic :: Response < Self :: ResponseStream > , tonic :: Status > ; fn call (& mut self , request : tonic :: Request < super :: ReadBlobRequest >) -> Self :: Future { let inner = self . 0 . clone () ; let fut = async move { (* inner) . read_blob (request) . await } ; Box :: pin (fut) } } let inner = self . inner . clone () ; let fut = async move { let interceptor = inner . 1 ; let inner = inner . 0 ; let method = ReadBlobSvc (inner) ; let codec = tonic :: codec :: ProstCodec :: default () ; let mut grpc = if let Some (interceptor) = interceptor { tonic :: server :: Grpc :: with_interceptor (codec , interceptor) } else { tonic :: server :: Grpc :: new (codec) } ; 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 (tonic :: body :: BoxBody :: empty ()) . unwrap ()) }) , } } } impl < T : TensorBoardDataProvider > Clone for TensorBoardDataProviderServer < T > { fn clone (& self) -> Self { let inner = self . inner . clone () ; Self { inner } } } impl < T : TensorBoardDataProvider > Clone for _Inner < T > { fn clone (& self) -> Self { Self (self . 0 . clone () , self . 1 . clone ()) } } impl < T : std :: fmt :: Debug > std :: fmt :: Debug for _Inner < T > { fn fmt (& self , f : & mut std :: fmt :: Formatter < '_ >) -> std :: fmt :: Result { write ! (f , "{:?}" , self . 0) } } impl < T : TensorBoardDataProvider > tonic :: transport :: NamedService for TensorBoardDataProviderServer < T > { const NAME : & 'static str = "tensorboard.data.TensorBoardDataProvider" ; } } \ No newline at end of file diff --git a/third_party/rust/crates.bzl b/third_party/rust/crates.bzl index 2211649c4c3..553bfc6dd3c 100644 --- a/third_party/rust/crates.bzl +++ b/third_party/rust/crates.bzl @@ -1413,42 +1413,52 @@ def raze_fetch_remote_crates(): maybe( http_archive, - name = "raze__tokio_util__0_6_1", - url = "https://crates.io/api/v1/crates/tokio-util/0.6.1/download", + name = "raze__tokio_util__0_6_6", + url = "https://crates.io/api/v1/crates/tokio-util/0.6.6/download", type = "tar.gz", - sha256 = "12ae4751faa60b9f96dd8344d74592e5a17c0c9a220413dbc6942d14139bbfcc", - strip_prefix = "tokio-util-0.6.1", - build_file = Label("//third_party/rust/remote:BUILD.tokio-util-0.6.1.bazel"), + sha256 = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e", + strip_prefix = "tokio-util-0.6.6", + build_file = Label("//third_party/rust/remote:BUILD.tokio-util-0.6.6.bazel"), ) maybe( http_archive, - name = "raze__tonic__0_4_0", - url = "https://crates.io/api/v1/crates/tonic/0.4.0/download", + name = "raze__tonic__0_4_2", + url = "https://crates.io/api/v1/crates/tonic/0.4.2/download", type = "tar.gz", - sha256 = "3ba8f479158947373b6df40cf48f4779bb25c99ca3c661bd95e0ab1963ad8b0e", - strip_prefix = "tonic-0.4.0", - build_file = Label("//third_party/rust/remote:BUILD.tonic-0.4.0.bazel"), + sha256 = "556dc31b450f45d18279cfc3d2519280273f460d5387e6b7b24503e65d206f8b", + strip_prefix = "tonic-0.4.2", + build_file = Label("//third_party/rust/remote:BUILD.tonic-0.4.2.bazel"), ) maybe( http_archive, - name = "raze__tonic_build__0_4_0", - url = "https://crates.io/api/v1/crates/tonic-build/0.4.0/download", + name = "raze__tonic_build__0_4_2", + url = "https://crates.io/api/v1/crates/tonic-build/0.4.2/download", type = "tar.gz", - sha256 = "c1e8546fd40d56d28089835c0a81bb396848103b00f888aea42d46eb5974df07", - strip_prefix = "tonic-build-0.4.0", - build_file = Label("//third_party/rust/remote:BUILD.tonic-build-0.4.0.bazel"), + sha256 = "c695de27302f4697191dda1c7178131a8cb805463dda02864acb80fe1322fdcf", + strip_prefix = "tonic-build-0.4.2", + build_file = Label("//third_party/rust/remote:BUILD.tonic-build-0.4.2.bazel"), ) maybe( http_archive, - name = "raze__tower__0_4_3", - url = "https://crates.io/api/v1/crates/tower/0.4.3/download", + name = "raze__tonic_reflection__0_1_0", + url = "https://crates.io/api/v1/crates/tonic-reflection/0.1.0/download", type = "tar.gz", - sha256 = "855703d368d4c9321ccc1efe1b0fe436c3f20b102b25060707ebe6b4502bdefb", - strip_prefix = "tower-0.4.3", - build_file = Label("//third_party/rust/remote:BUILD.tower-0.4.3.bazel"), + sha256 = "56498d20188550337ea6c48ecf59d11646382dbfcd61051fb98c1093cfae3c21", + strip_prefix = "tonic-reflection-0.1.0", + build_file = Label("//third_party/rust/remote:BUILD.tonic-reflection-0.1.0.bazel"), + ) + + maybe( + http_archive, + name = "raze__tower__0_4_6", + url = "https://crates.io/api/v1/crates/tower/0.4.6/download", + type = "tar.gz", + sha256 = "f715efe02c0862926eb463e49368d38ddb119383475686178e32e26d15d06a66", + strip_prefix = "tower-0.4.6", + build_file = Label("//third_party/rust/remote:BUILD.tower-0.4.6.bazel"), ) maybe( diff --git a/third_party/rust/remote/BUILD.h2-0.3.0.bazel b/third_party/rust/remote/BUILD.h2-0.3.0.bazel index 76649ee0486..77853c5bacb 100644 --- a/third_party/rust/remote/BUILD.h2-0.3.0.bazel +++ b/third_party/rust/remote/BUILD.h2-0.3.0.bazel @@ -64,7 +64,7 @@ rust_library( "@raze__indexmap__1_6_0//:indexmap", "@raze__slab__0_4_2//:slab", "@raze__tokio__1_0_2//:tokio", - "@raze__tokio_util__0_6_1//:tokio_util", + "@raze__tokio_util__0_6_6//:tokio_util", "@raze__tracing__0_1_21//:tracing", "@raze__tracing_futures__0_2_4//:tracing_futures", ], diff --git a/third_party/rust/remote/BUILD.tokio-util-0.6.1.bazel b/third_party/rust/remote/BUILD.tokio-util-0.6.6.bazel similarity index 90% rename from third_party/rust/remote/BUILD.tokio-util-0.6.1.bazel rename to third_party/rust/remote/BUILD.tokio-util-0.6.6.bazel index 95ddfff3c72..dbd8cdbd059 100644 --- a/third_party/rust/remote/BUILD.tokio-util-0.6.1.bazel +++ b/third_party/rust/remote/BUILD.tokio-util-0.6.6.bazel @@ -48,7 +48,7 @@ rust_library( "cargo-raze", "manual", ], - version = "0.6.1", + version = "0.6.6", # buildifier: leave-alone deps = [ "@raze__bytes__1_0_1//:bytes", @@ -57,7 +57,6 @@ rust_library( "@raze__log__0_4_11//:log", "@raze__pin_project_lite__0_2_4//:pin_project_lite", "@raze__tokio__1_0_2//:tokio", - "@raze__tokio_stream__0_1_2//:tokio_stream", ], ) @@ -77,6 +76,12 @@ rust_library( # Unsupported target "length_delimited" with type "test" omitted +# Unsupported target "mpsc" with type "test" omitted + +# Unsupported target "poll_semaphore" with type "test" omitted + +# Unsupported target "reusable_box" with type "test" omitted + # Unsupported target "sync_cancellation_token" with type "test" omitted # Unsupported target "time_delay_queue" with type "test" omitted diff --git a/third_party/rust/remote/BUILD.tonic-0.4.0.bazel b/third_party/rust/remote/BUILD.tonic-0.4.2.bazel similarity index 95% rename from third_party/rust/remote/BUILD.tonic-0.4.0.bazel rename to third_party/rust/remote/BUILD.tonic-0.4.2.bazel index d255a3507d4..9c02078857f 100644 --- a/third_party/rust/remote/BUILD.tonic-0.4.0.bazel +++ b/third_party/rust/remote/BUILD.tonic-0.4.2.bazel @@ -67,7 +67,7 @@ rust_library( "cargo-raze", "manual", ], - version = "0.4.0", + version = "0.4.2", # buildifier: leave-alone deps = [ "@raze__async_stream__0_3_0//:async_stream", @@ -84,8 +84,8 @@ rust_library( "@raze__prost__0_7_0//:prost", "@raze__tokio__1_0_2//:tokio", "@raze__tokio_stream__0_1_2//:tokio_stream", - "@raze__tokio_util__0_6_1//:tokio_util", - "@raze__tower__0_4_3//:tower", + "@raze__tokio_util__0_6_6//:tokio_util", + "@raze__tower__0_4_6//:tower", "@raze__tower_service__0_3_0//:tower_service", "@raze__tracing__0_1_21//:tracing", "@raze__tracing_futures__0_2_4//:tracing_futures", diff --git a/third_party/rust/remote/BUILD.tonic-build-0.4.0.bazel b/third_party/rust/remote/BUILD.tonic-build-0.4.2.bazel similarity index 98% rename from third_party/rust/remote/BUILD.tonic-build-0.4.0.bazel rename to third_party/rust/remote/BUILD.tonic-build-0.4.2.bazel index de2465040c3..c0e2b1dfdc5 100644 --- a/third_party/rust/remote/BUILD.tonic-build-0.4.0.bazel +++ b/third_party/rust/remote/BUILD.tonic-build-0.4.2.bazel @@ -51,7 +51,7 @@ rust_library( "cargo-raze", "manual", ], - version = "0.4.0", + version = "0.4.2", # buildifier: leave-alone deps = [ "@raze__proc_macro2__1_0_24//:proc_macro2", diff --git a/third_party/rust/remote/BUILD.tonic-reflection-0.1.0.bazel b/third_party/rust/remote/BUILD.tonic-reflection-0.1.0.bazel new file mode 100644 index 00000000000..2d76c02f1c5 --- /dev/null +++ b/third_party/rust/remote/BUILD.tonic-reflection-0.1.0.bazel @@ -0,0 +1,95 @@ +""" +@generated +cargo-raze crate build file. + +DO NOT EDIT! Replaced on runs of cargo-raze +""" + +# buildifier: disable=load +load( + "@rules_rust//rust:rust.bzl", + "rust_binary", + "rust_library", + "rust_test", +) + +# buildifier: disable=load +load("@bazel_skylib//lib:selects.bzl", "selects") + +package(default_visibility = [ + # Public for visibility by "@raze__crate__version//" targets. + # + # Prefer access through "//third_party/rust", which limits external + # visibility to explicit Cargo.toml dependencies. + "//visibility:public", +]) + +licenses([ + "notice", # MIT from expression "MIT" +]) + +# Generated Targets +# buildifier: disable=load-on-top +load( + "@rules_rust//cargo:cargo_build_script.bzl", + "cargo_build_script", +) + +cargo_build_script( + name = "tonic_reflection_build_script", + srcs = glob(["**/*.rs"]), + build_script_env = { + "PROTOC": "$(execpath @com_google_protobuf//:protoc)", + "RUSTFMT": "/bin/true", + }, + crate_features = [ + ], + crate_root = "build.rs", + data = glob(["**"]) + [ + "@com_google_protobuf//:protoc", + ], + edition = "2018", + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-raze", + "manual", + ], + version = "0.1.0", + visibility = ["//visibility:private"], + deps = [ + "@raze__tonic_build__0_4_2//:tonic_build", + ], +) + +rust_library( + name = "tonic_reflection", + srcs = glob(["**/*.rs"]), + crate_features = [ + ], + crate_root = "src/lib.rs", + crate_type = "lib", + data = [], + edition = "2018", + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-raze", + "manual", + ], + version = "0.1.0", + # buildifier: leave-alone + deps = [ + ":tonic_reflection_build_script", + "@raze__bytes__1_0_1//:bytes", + "@raze__prost__0_7_0//:prost", + "@raze__prost_types__0_7_0//:prost_types", + "@raze__tokio__1_0_2//:tokio", + "@raze__tokio_stream__0_1_2//:tokio_stream", + "@raze__tonic__0_4_2//:tonic", + ], +) + +# Unsupported target "server" with type "test" omitted diff --git a/third_party/rust/remote/BUILD.tower-0.4.3.bazel b/third_party/rust/remote/BUILD.tower-0.4.6.bazel similarity index 95% rename from third_party/rust/remote/BUILD.tower-0.4.3.bazel rename to third_party/rust/remote/BUILD.tower-0.4.6.bazel index 1551c962645..f3f3d7aa8bd 100644 --- a/third_party/rust/remote/BUILD.tower-0.4.3.bazel +++ b/third_party/rust/remote/BUILD.tower-0.4.6.bazel @@ -52,6 +52,8 @@ rust_library( "timeout", "tokio", "tokio-stream", + "tokio-util", + "tracing", "util", ], crate_root = "src/lib.rs", @@ -65,7 +67,7 @@ rust_library( "cargo-raze", "manual", ], - version = "0.4.3", + version = "0.4.6", # buildifier: leave-alone deps = [ "@raze__futures_core__0_3_12//:futures_core", @@ -76,6 +78,7 @@ rust_library( "@raze__slab__0_4_2//:slab", "@raze__tokio__1_0_2//:tokio", "@raze__tokio_stream__0_1_2//:tokio_stream", + "@raze__tokio_util__0_6_6//:tokio_util", "@raze__tower_layer__0_3_1//:tower_layer", "@raze__tower_service__0_3_0//:tower_service", "@raze__tracing__0_1_21//:tracing", From 5ab44144795d48945270a89e101df5797ae8ab58 Mon Sep 17 00:00:00 2001 From: William Chargin Date: Wed, 14 Apr 2021 16:05:02 -0700 Subject: [PATCH 2/3] [rust-dep-tonic-reflection: add Rustfmt for tonic-reflection build script] wchargin-branch: rust-dep-tonic-reflection wchargin-source: 1ce18e320ee4fb02d22b5e73656dd0bc7d08109d --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b1dcb62706..c7f9011907e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -146,6 +146,7 @@ jobs: with: toolchain: ${{ matrix.rust_version }} default: true + components: rustfmt - name: 'Install Python packaging deps' run: | python -m pip install -U pip From 0db919635424adfbf34064ff7f1b8c3d57304bf4 Mon Sep 17 00:00:00 2001 From: William Chargin Date: Thu, 15 Apr 2021 23:03:25 -0700 Subject: [PATCH 3/3] [rust-dep-tonic-reflection: add link to upstream rustfmt issue] wchargin-branch: rust-dep-tonic-reflection wchargin-source: ae8bd60c1c2bbc0b8e3c03081f8e9387bf391651 --- tensorboard/data/server/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorboard/data/server/Cargo.toml b/tensorboard/data/server/Cargo.toml index 7210010871c..f13f3e83bae 100644 --- a/tensorboard/data/server/Cargo.toml +++ b/tensorboard/data/server/Cargo.toml @@ -121,5 +121,6 @@ build_data_dependencies = ["@com_google_protobuf//:protoc"] [package.metadata.raze.crates.tonic-reflection.'0.1.0'.buildrs_additional_environment_variables] PROTOC = "$(execpath @com_google_protobuf//:protoc)" -# we don't have easy access to a rustfmt binary, so make it a no-op +# We don't have easy access to a rustfmt binary, so make it a no-op. +# https://github.com/bazelbuild/rules_rust/issues/87 RUSTFMT = "/bin/true"