mirror of
https://codeberg.org/JasterV/granc.git
synced 2026-04-26 18:40:05 +00:00
refactor: separate reflection generation (#20)
This commit is contained in:
parent
f75dc1b9a4
commit
8452a6786b
7 changed files with 80 additions and 39 deletions
30
Cargo.lock
generated
30
Cargo.lock
generated
|
|
@ -330,12 +330,19 @@ name = "granc"
|
|||
version = "0.2.4"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"granc_core",
|
||||
"granc_core 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json",
|
||||
"tokio",
|
||||
"tonic",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "granc-tools"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"tonic-prost-build",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "granc_core"
|
||||
version = "0.2.4"
|
||||
|
|
@ -353,10 +360,29 @@ dependencies = [
|
|||
"tokio-stream",
|
||||
"tonic",
|
||||
"tonic-prost",
|
||||
"tonic-prost-build",
|
||||
"tonic-reflection",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "granc_core"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b70761ae61e50a3da701f80dec0a5768e43420895922e233894865ce3969cea"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"prost",
|
||||
"prost-reflect",
|
||||
"prost-types",
|
||||
"serde_json",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
"tonic",
|
||||
"tonic-prost",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.4.13"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
[workspace]
|
||||
members = ["granc", "granc-core", "echo-service"]
|
||||
members = ["granc", "granc-core", "granc-tools", "echo-service"]
|
||||
resolver = "2"
|
||||
|
||||
[workspace.package]
|
||||
|
|
|
|||
|
|
@ -13,18 +13,10 @@ repository = { workspace = true }
|
|||
rust-version = { workspace = true }
|
||||
version = { workspace = true }
|
||||
|
||||
[features]
|
||||
gen-proto = ["dep:tonic-prost-build"]
|
||||
|
||||
[lib]
|
||||
name = "granc_core"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "generate-reflection-service"
|
||||
path = "bin/generate_reflection_service.rs"
|
||||
required-features = ["gen-proto"]
|
||||
|
||||
[dependencies]
|
||||
futures-util = "0.3.31"
|
||||
http = "1.4.0"
|
||||
|
|
@ -38,7 +30,6 @@ tokio = { workspace = true, features = ["sync"] }
|
|||
tokio-stream = "0.1.18"
|
||||
tonic = { workspace = true }
|
||||
tonic-prost = { workspace = true }
|
||||
tonic-prost-build = { workspace = true, optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
echo-service = { path = "../echo-service" }
|
||||
|
|
|
|||
|
|
@ -7,11 +7,10 @@ pub struct ServerReflectionRequest {
|
|||
/// To use reflection service, the client should set one of the following
|
||||
/// fields in message_request. The server distinguishes requests by their
|
||||
/// defined field and then handles them using corresponding methods.
|
||||
#[prost(
|
||||
oneof = "server_reflection_request::MessageRequest",
|
||||
tags = "3, 4, 5, 6, 7"
|
||||
)]
|
||||
pub message_request: ::core::option::Option<server_reflection_request::MessageRequest>,
|
||||
#[prost(oneof = "server_reflection_request::MessageRequest", tags = "3, 4, 5, 6, 7")]
|
||||
pub message_request: ::core::option::Option<
|
||||
server_reflection_request::MessageRequest,
|
||||
>,
|
||||
}
|
||||
/// Nested message and enum types in `ServerReflectionRequest`.
|
||||
pub mod server_reflection_request {
|
||||
|
|
@ -67,11 +66,10 @@ pub struct ServerReflectionResponse {
|
|||
pub original_request: ::core::option::Option<ServerReflectionRequest>,
|
||||
/// The server sets one of the following fields according to the message_request
|
||||
/// in the request.
|
||||
#[prost(
|
||||
oneof = "server_reflection_response::MessageResponse",
|
||||
tags = "4, 5, 6, 7"
|
||||
)]
|
||||
pub message_response: ::core::option::Option<server_reflection_response::MessageResponse>,
|
||||
#[prost(oneof = "server_reflection_response::MessageResponse", tags = "4, 5, 6, 7")]
|
||||
pub message_response: ::core::option::Option<
|
||||
server_reflection_response::MessageResponse,
|
||||
>,
|
||||
}
|
||||
/// Nested message and enum types in `ServerReflectionResponse`.
|
||||
pub mod server_reflection_response {
|
||||
|
|
@ -153,10 +151,10 @@ pub mod server_reflection_client {
|
|||
dead_code,
|
||||
missing_docs,
|
||||
clippy::wildcard_imports,
|
||||
clippy::let_unit_value
|
||||
clippy::let_unit_value,
|
||||
)]
|
||||
use tonic::codegen::http::Uri;
|
||||
use tonic::codegen::*;
|
||||
use tonic::codegen::http::Uri;
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ServerReflectionClient<T> {
|
||||
inner: tonic::client::Grpc<T>,
|
||||
|
|
@ -200,8 +198,9 @@ pub mod server_reflection_client {
|
|||
<T as tonic::client::GrpcService<tonic::body::Body>>::ResponseBody,
|
||||
>,
|
||||
>,
|
||||
<T as tonic::codegen::Service<http::Request<tonic::body::Body>>>::Error:
|
||||
Into<StdError> + std::marker::Send + std::marker::Sync,
|
||||
<T as tonic::codegen::Service<
|
||||
http::Request<tonic::body::Body>,
|
||||
>>::Error: Into<StdError> + std::marker::Send + std::marker::Sync,
|
||||
{
|
||||
ServerReflectionClient::new(InterceptedService::new(inner, interceptor))
|
||||
}
|
||||
|
|
@ -240,23 +239,33 @@ pub mod server_reflection_client {
|
|||
/// all related requests go to a single server.
|
||||
pub async fn server_reflection_info(
|
||||
&mut self,
|
||||
request: impl tonic::IntoStreamingRequest<Message = super::ServerReflectionRequest>,
|
||||
request: impl tonic::IntoStreamingRequest<
|
||||
Message = super::ServerReflectionRequest,
|
||||
>,
|
||||
) -> std::result::Result<
|
||||
tonic::Response<tonic::codec::Streaming<super::ServerReflectionResponse>>,
|
||||
tonic::Status,
|
||||
> {
|
||||
self.inner.ready().await.map_err(|e| {
|
||||
tonic::Status::unknown(format!("Service was not ready: {}", e.into()))
|
||||
self.inner
|
||||
.ready()
|
||||
.await
|
||||
.map_err(|e| {
|
||||
tonic::Status::unknown(
|
||||
format!("Service was not ready: {}", e.into()),
|
||||
)
|
||||
})?;
|
||||
let codec = tonic_prost::ProstCodec::default();
|
||||
let path = http::uri::PathAndQuery::from_static(
|
||||
"/grpc.reflection.v1.ServerReflection/ServerReflectionInfo",
|
||||
);
|
||||
let mut req = request.into_streaming_request();
|
||||
req.extensions_mut().insert(GrpcMethod::new(
|
||||
req.extensions_mut()
|
||||
.insert(
|
||||
GrpcMethod::new(
|
||||
"grpc.reflection.v1.ServerReflection",
|
||||
"ServerReflectionInfo",
|
||||
));
|
||||
),
|
||||
);
|
||||
self.inner.streaming(req, path, codec).await
|
||||
}
|
||||
}
|
||||
|
|
|
|||
15
granc-tools/Cargo.toml
Normal file
15
granc-tools/Cargo.toml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
[package]
|
||||
name = "granc-tools"
|
||||
edition = { workspace = true }
|
||||
publish = false
|
||||
|
||||
[features]
|
||||
gen-proto = ["dep:tonic-prost-build"]
|
||||
|
||||
[[bin]]
|
||||
name = "generate-reflection-service"
|
||||
path = "bin/generate_reflection_service.rs"
|
||||
required-features = ["gen-proto"]
|
||||
|
||||
[dependencies]
|
||||
tonic-prost-build = { workspace = true, optional = true }
|
||||
|
|
@ -6,7 +6,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
println!("Generating Reflection Service types...");
|
||||
|
||||
let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||
let out_dir = manifest_dir.join("src/reflection/generated");
|
||||
let out_dir = manifest_dir.join("../granc-core/src/reflection/generated");
|
||||
|
||||
let proto_file = manifest_dir.join("proto/reflection.proto");
|
||||
let proto_folder = manifest_dir.join("proto");
|
||||
Loading…
Reference in a new issue