actix-web-rest-macros

Crates.ioactix-web-rest-macros
lib.rsactix-web-rest-macros
version0.3.0
sourcesrc
created_at2023-06-17 21:15:39.764672
updated_at2023-06-25 15:38:48.037891
descriptionOpiniated toolkit to build restful API using actix-web.
homepage
repositoryhttps://github.com/negrel/actix-web-rest
max_upload_size
id893134
size16,960
Alexandre Negrel (negrel)

documentation

https://docs.rs/actix-web-rest-macros

README

actix-web-rest - Opiniated toolkit to build restful API using actix-web.

This crate contains utility to speed up the development of RESTful API using actix-web:

  • rest_error attribute macros

Why ?

:zap: Gotta go fast!

:student: Learn procedural macros.

Getting started

# Create a new project.
cargo init my_api && cd my_api

# Add actix-web-rest to your project.
cargo add actix-web-rest actix-web anyhow thiserror

Then overwrite main.rs with the following content:

use actix_web::{web, App, HttpResponse, HttpServer, ResponseError};
use actix_web_rest::{actix_web, http::StatusCode, rest_error};
use anyhow::anyhow;

#[allow(clippy::enum_variant_names)]
#[rest_error(internal_error)] // internal_error add an InternalError(#[from] anyhow::Error).
enum MyEndpointError {
    #[rest(status_code = StatusCode::OK)]
    #[error("error foo")]
    FooError,

    #[rest(status_code = StatusCode::OK)]
    #[error("error bar")]
    BarError,
}

async fn handler(path: web::Path<String>) -> Result<HttpResponse, impl ResponseError> {
    let path_param = path.into_inner();
    match path_param.as_ref() {
        "foo" => Err(MyEndpointError::FooError),
        "bar" => Err(MyEndpointError::BarError),
        _ => Err(MyEndpointError::from(anyhow!(
            "unexpected path params: {path_param}"
        ))),
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().route("/{error}", web::get().to(handler)))
        .bind(("127.0.0.1", 8080))?
        .run()
        .await
}
curl -i http://localhost:8080/foo
curl -i http://localhost:8080/bar
curl -i http://localhost:8080/baz

Contributing

If you want to contribute to actix-web-rest to add a feature or improve the code contact me at negrel.dev@protonmail.com, open an issue or make a pull request.

:stars: Show your support

Please give a :star: if this project helped you!

buy me a coffee

:scroll: License

MIT © Alexandre Negrel

Commit count: 7

cargo fmt