In main, how do I transfer the layer to the run_grpc and run_http functions

use axum::{routing::get, Router};
use demo_server::{api::demo_server::DemoServer, MyGreeter};
use std::time::Duration;
use tonic::transport::Server;
use tower_http::{cors::CorsLayer, timeout::TimeoutLayer};

#[tokio::main]
async fn main() {
    let cors_layer = CorsLayer::new();
    let time_layer = TimeoutLayer::new(Duration::from_secs(5));

    let layer = tower::ServiceBuilder::new()
        .layer(cors_layer)
        .layer(time_layer)
        .into_inner();

    let g_lay = layer.clone();

    tokio::spawn(async move {
        run_grpc(layer).await;
    });

    tokio::spawn(async move {
        run_http(g_lay).await;
    });

    tokio::select! {
        _ = tokio::signal::ctrl_c() => {},
    }
}

async fn run_grpc<T>(layer: T)
where
    T: Clone + Send,
{
    let addr = "[::1]:50051".parse().unwrap();
    println!("grpc listening on {}", addr);

    let greeter = MyGreeter::default();
    let svc = DemoServer::new(greeter);

    Server::builder()
        .layer(layer)
        .add_service(svc)
        .serve(addr)
        .await
        .unwrap();
}

async fn run_http<T>(layer: T)
where
    T: Clone + Send + Sync,
{
    let app = Router::new().layer(layer).route(
        "/",
        get(|| async {
            println!("------sdfs----");
        }),
    );
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

In main, how do I transfer the layer to the run_grpc and run_http functions

Did you get a compiler error? If so, why not post it?

The error is very long, according to the compiler prompts to optimize the code, there will be more errors, if you can, in your own local run the above code, thank you

You haven't supplied code that can be compiled. I tried to stub out the parts I thought were not relevant (below) and it compiles for me without errors. Please provide code that can be compiled and produces the error.

use axum::{routing::get, Router};
use std::time::Duration;
use tonic::transport::Server;
use tower_http::{cors::CorsLayer, timeout::TimeoutLayer};

#[tokio::main]
async fn main() {
    let cors_layer = CorsLayer::new();
    let time_layer = TimeoutLayer::new(Duration::from_secs(5));

    let layer = tower::ServiceBuilder::new()
        .layer(cors_layer)
        .layer(time_layer)
        .into_inner();

    let g_lay = layer.clone();

    tokio::spawn(async move {
        run_grpc(layer).await;
    });

    tokio::spawn(async move {
        run_http(g_lay).await;
    });

    tokio::select! {
        _ = tokio::signal::ctrl_c() => {},
    }
}

async fn run_grpc<T>(layer: T)
where
    T: Clone + Send,
{
    todo!()
}

async fn run_http<T>(layer: T)
where
    T: Clone + Send + Sync,
{
    todo!()
}

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.