aboutsummaryrefslogtreecommitdiffstats
path: root/crates/configuration/src/server.rs
blob: dec0813de666fc62123e27a4beb1e9f57f1b77bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
pub mod error;
pub mod grpc_svc;
mod http_svc;
pub mod reload_stream;
mod version;

use grpc_svc::interceptor::MyInterceptor;
use http_svc::build_router;
use tonic::service::Routes;
use tower_http::trace::TraceLayer;
use warden_core::{
    FILE_DESCRIPTOR_SET,
    configuration::routing::{
        mutate_routing_server::MutateRoutingServer, query_routing_server::QueryRoutingServer,
    },
};

use crate::{server::error::AppError, state::AppHandle};

pub fn serve(state: AppHandle) -> Result<(axum::Router, axum::Router), AppError> {
    let app = build_router(state.clone());

    let service = QueryRoutingServer::with_interceptor(state.clone(), MyInterceptor);

    let routing_reflector = tonic_reflection::server::Builder::configure()
        .register_encoded_file_descriptor_set(FILE_DESCRIPTOR_SET)
        .build_v1()?;

    let grpc_server = Routes::new(service)
        .add_service(MutateRoutingServer::with_interceptor(
            state.clone(),
            MyInterceptor,
        ))
        .add_service(routing_reflector)
        .into_axum_router()
        .layer(
            TraceLayer::new_for_grpc().make_span_with(|request: &axum::http::Request<_>| {
                tracing::trace_span!(env!("CARGO_PKG_NAME"), "otel.kind" = "server",
                    headers = ?request.headers()
                )
            }),
        );

    Ok((app, grpc_server))
}