comprehensive_grpc

Crates.iocomprehensive_grpc
lib.rscomprehensive_grpc
version
sourcesrc
created_at2024-10-22 23:12:24.138041
updated_at2025-01-17 20:08:19.41837
descriptionA harness for creating consistently-shaped servers will less boilerplate
homepagehttps://github.com/vandry/comprehensive
repositoryhttps://github.com/vandry/comprehensive.git
max_upload_size
id1419431
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`
size0
Kim Vandry (vandry)

documentation

README

[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.

Usage

There are 2 ways to use it:

Derive resources that conjure the server and install themselves in 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();

Depend on [GrpcServer] directly

The 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{})
);

Command line flags for the gRPC server

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.

On descriptors

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");
Commit count: 25

cargo fmt