gRPC service with Tonic

Roadster best supports API services using Axum. However, we do provide a gRPC service via a basic integration with tonic. Support is pretty minimal and you'll need to manage building your gRPC Router yourself. However, once it's built, Roadster can take care of running it for you.

fn build_app() -> RoadsterResult<RoadsterApp<AppContext>> {
    let app = RoadsterApp::builder()
        // Use the default `AppContext` for this example
        .state_provider(|context| Ok(context))
        // Register the gRPC service with the provided routes
        .add_service(GrpcService::new(routes()?))
        .build();
    Ok(app)
}

/// Build the gRPC [`Router`].
fn routes() -> RoadsterResult<Router> {
    let reflection_service = tonic_reflection::server::Builder::configure()
        .register_encoded_file_descriptor_set(hello_world::FILE_DESCRIPTOR_SET)
        .build_v1()?;

    let router = Server::builder()
        .add_service(reflection_service)
        .add_service(GreeterServer::new(MyGreeter));

    Ok(router)
}