Skip to content

How to properly type the GovernorLayer? #49

Description

@DoneDeal0

Hello, I would like to extract your limiter in a function, to import it from a separate file in an Axum server.

use axum::{Router, routing::get};
use dotenvy::dotenv;
use std::{env, sync::Arc};

mod middleware;
mod models;
mod router;
use middleware::cors::get_cors;
use router::user::user_routes;

use tower_governor::{GovernorLayer, governor::GovernorConfigBuilder};

fn get_rate_limiter() {
    let rate_limiter = Arc::new(
        GovernorConfigBuilder::default()
            .per_second(2)
            .burst_size(5)
            .finish()
            .unwrap(),
    );
    GovernorLayer {
        config: get_rate_limiter(),
    }
}

#[tokio::main]
async fn main() {
    dotenv().ok();
    let server_port = env::var("SERVER_PORT").unwrap();
    let app = Router::new()
        .nest("/", user_routes())
        .layer(get_cors())
        .layer(get_rate_limiter());
    let listener = tokio::net::TcpListener::bind(&server_port).await.unwrap();
    println!("🔥 Server running on {}", server_port);
    axum::serve(listener, app).await.unwrap();
}

The get_rate_limiter return the following type error:

mismatched types expected unit type () found struct GovernorLayer<_, _>

So I wrote

fn get_rate_limiter() -> GovernorLayer<PeerIpKeyExtractor, _> {}

And the error is refined to:

cannot find type RateLimitingMiddleware in this scope

It seems i can't import RateLimitingMiddleware. How to fix this typing issue? Thanks!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions