1
0
mirror of https://github.com/fafhrd91/actix-web synced 2024-11-30 10:42:55 +01:00

fix: wrap attribute codegen regression when using expression (#3119)

This commit is contained in:
Rob Ede 2023-08-29 21:27:36 +01:00 committed by GitHub
parent 39abe3ae5e
commit 76f6106f8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 29 additions and 12 deletions

View File

@ -2,6 +2,10 @@
## Unreleased ## Unreleased
## 4.2.2
- Fix regression when declaring `wrap` attribute using an expression.
## 4.2.1 ## 4.2.1
- Update `syn` dependency to `2`. - Update `syn` dependency to `2`.

View File

@ -1,6 +1,6 @@
[package] [package]
name = "actix-web-codegen" name = "actix-web-codegen"
version = "4.2.1" version = "4.2.2"
description = "Routing and runtime macros for Actix Web" description = "Routing and runtime macros for Actix Web"
homepage = "https://actix.rs" homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-web.git" repository = "https://github.com/actix/actix-web.git"

View File

@ -3,11 +3,11 @@
> Routing and runtime macros for Actix Web. > Routing and runtime macros for Actix Web.
[![crates.io](https://img.shields.io/crates/v/actix-web-codegen?label=latest)](https://crates.io/crates/actix-web-codegen) [![crates.io](https://img.shields.io/crates/v/actix-web-codegen?label=latest)](https://crates.io/crates/actix-web-codegen)
[![Documentation](https://docs.rs/actix-web-codegen/badge.svg?version=4.2.1)](https://docs.rs/actix-web-codegen/4.2.1) [![Documentation](https://docs.rs/actix-web-codegen/badge.svg?version=4.2.2)](https://docs.rs/actix-web-codegen/4.2.2)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg) ![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![License](https://img.shields.io/crates/l/actix-web-codegen.svg) ![License](https://img.shields.io/crates/l/actix-web-codegen.svg)
<br /> <br />
[![dependency status](https://deps.rs/crate/actix-web-codegen/4.2.1/status.svg)](https://deps.rs/crate/actix-web-codegen/4.2.1) [![dependency status](https://deps.rs/crate/actix-web-codegen/4.2.2/status.svg)](https://deps.rs/crate/actix-web-codegen/4.2.2)
[![Download](https://img.shields.io/crates/d/actix-web-codegen.svg)](https://crates.io/crates/actix-web-codegen) [![Download](https://img.shields.io/crates/d/actix-web-codegen.svg)](https://crates.io/crates/actix-web-codegen)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x) [![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

View File

@ -224,7 +224,7 @@ struct Args {
path: syn::LitStr, path: syn::LitStr,
resource_name: Option<syn::LitStr>, resource_name: Option<syn::LitStr>,
guards: Vec<Path>, guards: Vec<Path>,
wrappers: Vec<syn::Type>, wrappers: Vec<syn::Expr>,
methods: HashSet<MethodTypeExt>, methods: HashSet<MethodTypeExt>,
} }
@ -251,7 +251,7 @@ impl Args {
} else { } else {
return Err(syn::Error::new_spanned( return Err(syn::Error::new_spanned(
nv.value, nv.value,
"Attribute name expects literal string!", "Attribute name expects literal string",
)); ));
} }
} else if nv.path.is_ident("guard") { } else if nv.path.is_ident("guard") {
@ -264,7 +264,7 @@ impl Args {
} else { } else {
return Err(syn::Error::new_spanned( return Err(syn::Error::new_spanned(
nv.value, nv.value,
"Attribute guard expects literal string!", "Attribute guard expects literal string",
)); ));
} }
} else if nv.path.is_ident("wrap") { } else if nv.path.is_ident("wrap") {
@ -283,9 +283,9 @@ impl Args {
} else if nv.path.is_ident("method") { } else if nv.path.is_ident("method") {
if !is_route_macro { if !is_route_macro {
return Err(syn::Error::new_spanned( return Err(syn::Error::new_spanned(
&nv, &nv,
"HTTP method forbidden here. To handle multiple methods, use `route` instead", "HTTP method forbidden here; to handle multiple methods, use `route` instead",
)); ));
} else if let syn::Expr::Lit(syn::ExprLit { } else if let syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit), lit: syn::Lit::Str(lit),
.. ..
@ -300,13 +300,13 @@ impl Args {
} else { } else {
return Err(syn::Error::new_spanned( return Err(syn::Error::new_spanned(
nv.value, nv.value,
"Attribute method expects literal string!", "Attribute method expects literal string",
)); ));
} }
} else { } else {
return Err(syn::Error::new_spanned( return Err(syn::Error::new_spanned(
nv.path, nv.path,
"Unknown attribute key is specified. Allowed: guard, method and wrap", "Unknown attribute key is specified; allowed: guard, method and wrap",
)); ));
} }
} }

View File

@ -212,6 +212,19 @@ async fn get_wrap(_: web::Path<String>) -> impl Responder {
HttpResponse::Ok() HttpResponse::Ok()
} }
/// Using expression, not just path to type, in wrap attribute.
///
/// Regression from <https://github.com/actix/actix-web/issues/3118>.
#[route(
"/catalog",
method = "GET",
method = "HEAD",
wrap = "actix_web::middleware::Compress::default()"
)]
async fn get_catalog() -> impl Responder {
HttpResponse::Ok().body("123123123")
}
#[actix_rt::test] #[actix_rt::test]
async fn test_params() { async fn test_params() {
let srv = actix_test::start(|| { let srv = actix_test::start(|| {

View File

@ -38,7 +38,7 @@ error: Multiple paths specified! There should be only one.
| |
= note: this error originates in the attribute macro `delete` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the attribute macro `delete` (in Nightly builds, run with -Z macro-backtrace for more info)
error: HTTP method forbidden here. To handle multiple methods, use `route` instead error: HTTP method forbidden here; to handle multiple methods, use `route` instead
--> $DIR/simple-fail.rs:25:19 --> $DIR/simple-fail.rs:25:19
| |
25 | #[delete("/five", method="GET")] 25 | #[delete("/five", method="GET")]