Crates.io | comprehensive_grpc |
lib.rs | comprehensive_grpc |
version | |
source | src |
created_at | 2024-10-22 23:12:24.138041 |
updated_at | 2025-01-17 20:08:19.41837 |
description | A harness for creating consistently-shaped servers will less boilerplate |
homepage | https://github.com/vandry/comprehensive |
repository | https://github.com/vandry/comprehensive.git |
max_upload_size | |
id | 1419431 |
Cargo.toml error: | TOML parse error at line 17, column 1 | 17 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
[comprehensive
] [Resource
] types for gRPC serving
This crate provides [Resource
] types for use in a [comprehensive
]
Assembly
. To use it, build an Assembly
and include resources
from this crate in the dependency graph.
There are 2 ways to use it:
A [GrpcService
] is a [Resource
] and depending upon it will cause
the server to run with the service in question (and others) installed:
use comprehensive::{NoArgs, NoDependencies, Resource, ResourceDependencies};
use comprehensive_grpc::GrpcService;
impl Resource for Implementation {
type Args = NoArgs;
type Dependencies = NoDependencies;
const NAME: &str = "TestServer";
fn new(_: NoDependencies, _: NoArgs) -> Result<Self, Box<dyn std::error::Error>> {
Ok(Self {})
}
}
#[tonic::async_trait]
impl pb::test_server::Test for Implementation {
// ...
}
#[derive(GrpcService)]
#[implementation(Implementation)]
#[service(pb::test_server::TestServer)]
#[descriptor(pb::FILE_DESCRIPTOR_SET)]
struct TestService;
#[derive(ResourceDependencies)]
struct AutoServer {
_s: std::sync::Arc<TestService>,
}
let assembly = comprehensive::Assembly::<AutoServer>::new().unwrap();
GrpcServer
] directlyThe server can bee configured to add gRPC services to it:
use comprehensive::ResourceDependencies;
use comprehensive_grpc::GrpcServer;
#[derive(ResourceDependencies)]
struct JustAServer {
server: std::sync::Arc<GrpcServer>,
}
let assembly = comprehensive::Assembly::<JustAServer>::new().unwrap();
assembly.top.server.register_encoded_file_descriptor_set(
pb::FILE_DESCRIPTOR_SET
);
assembly.top.server.add_service(
pb::test_server::TestServer::new(Implementation{})
);
Flag | Default | Meaning |
---|---|---|
--grpc_port |
none | TCP port number for insecure gRPC server. If unset, plain gRPC is not served. |
--grpc_bind_addr |
:: |
Binding IP address for gRPC. Used only if --grpc_port is set. |
--grpcs_port |
none | TCP port number for secure gRPC server. If unset, gRPCs is not served. |
--grpcs_bind_addr |
:: |
Binding IP address for gRPCs. Used only if --grpcs_port is set. |
Because gRPC server reflection is very useful for diagnostics yet it is
too easy to forget to install the descriptors needed to make it happen,
[comprehensive_grpc
] tries to insist that descriptors are installed
before services are added to the server.
To obtain file descriptors, put this in build.rs
:
let fds_path =
std::path::PathBuf::from(std::env::var("OUT_DIR").expect("$OUT_DIR")).join("fdset.bin");
tonic_build::configure()
.file_descriptor_set_path(fds_path)
And this where you include your protos:
pub(crate) const FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("fdset");