Skip to content

swlkr/enum_router

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

enum_router

enum_router is a rust enum router for axum.

cargo add --git https://github.com/swlkr/enum_router

Declare your routes

use enum_router::router;

#[router]
pub enum Route {
  #[get("/")]
  Root,
  #[get("/todos/{id}/edit")]
  EditTodo(i32)
  #[put("/todos/{id}")]
  UpdateTodo(i32)
}

It will complain about missing functions which you still have to write:

async fn root() -> String {
  Route::Root.to_string() // "/"
}

async fn edit_todo(Path(id): Path<i32>) -> String {
  Route::EditTodo(id).to_string() // "/todos/{id}/edit"
}

async fn update_todo(Path(id): Path<i32>) -> String {
  Route::UpdateTodo(id).to_string() // "/todos/{id}"
}

Use it like this

#[tokio::main]
async fn main() {
  let ip = "127.0.0.1:9001";
  let listener = tokio::net::TcpListener::bind(ip).await.unwrap();
  let router = Route::router();
  axum::serve(listener, router).await.unwrap();
}

Got state?

use std::sync::Arc;
use axum::extract::State;

struct AppState {
  count: u64
}

#[router(Arc<AppState>)]
enum Route {
  #[get("/")]
  Index
}

async fn index(State(_st): State<Arc<AppState>>) -> String {
  Route::Index.to_string()
}

#[tokio::main]
async fn main() {
  let ip = "127.0.0.1:9001";
  let listener = tokio::net::TcpListener::bind(ip).await.unwrap();
  let router = Route::router().with_state(Arc::new(AppState { count: 0 }));
  axum::serve(listener, router).await.unwrap();
}

Resource routes

This crate does more than check your borrows, it now borrows a very productive feature from rails, resource routing!

#[router]
enum Route {
    #[get("/")]
    Index,
    #[router]
    Sessions(Sessions)
}

async fn index() -> String {
    Route::Index.to_string()
}

#[resource]
pub enum Sessions {
    Index, New, Create, Edit(i64), Update(i64)
}

impl Sessions {
    async fn index() -> String {
        Self::Index.to_string() // /sessions
    }

    async fn new() -> String {
        Self::New.to_string() // /sessions/new
    }

    async fn create() -> String {
        Self::Create.to_string() // /sessions
    }

    async fn edit(Path(id): Path<i64>) -> String {
        Self::Edit(id).to_string() // /sessions/1/edit
    }

    async fn update(Path(id): Path<i64>) -> String {
        Self::Update(id).to_string() // /sessions/1
    }
}

About

Simple enum router for axum

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages