aboutsummaryrefslogtreecommitdiff
path: root/src/api/common/router_macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/common/router_macros.rs')
-rw-r--r--src/api/common/router_macros.rs82
1 files changed, 80 insertions, 2 deletions
diff --git a/src/api/common/router_macros.rs b/src/api/common/router_macros.rs
index d9fe86db..299420f7 100644
--- a/src/api/common/router_macros.rs
+++ b/src/api/common/router_macros.rs
@@ -45,6 +45,68 @@ macro_rules! router_match {
}
}
}};
+ (@gen_path_parser_v2 ($method:expr, $reqpath:expr, $pathprefix:literal, $query:expr, $req:expr)
+ [
+ $(@special $spec_meth:ident $spec_path:pat => $spec_api:ident $spec_params:tt,)*
+ $($meth:ident $api:ident $params:tt,)*
+ ]) => {{
+ {
+ #[allow(unused_parens)]
+ match ($method, $reqpath) {
+ $(
+ (&Method::$spec_meth, $spec_path) => AdminApiRequest::$spec_api (
+ router_match!(@@gen_parse_request $spec_api, $spec_params, $query, $req)
+ ),
+ )*
+ $(
+ (&Method::$meth, concat!($pathprefix, stringify!($api)))
+ => AdminApiRequest::$api (
+ router_match!(@@gen_parse_request $api, $params, $query, $req)
+ ),
+ )*
+ (m, p) => {
+ return Err(Error::bad_request(format!(
+ "Unknown API endpoint: {} {}",
+ m, p
+ )))
+ }
+ }
+ }
+ }};
+ (@@gen_parse_request $api:ident, (), $query: expr, $req:expr) => {{
+ paste!(
+ [< $api Request >]
+ )
+ }};
+ (@@gen_parse_request $api:ident, (body), $query: expr, $req:expr) => {{
+ paste!({
+ parse_json_body::< [<$api Request>], _, Error>($req).await?
+ })
+ }};
+ (@@gen_parse_request $api:ident, (body_field, $($conv:ident $(($conv_arg:expr))? :: $param:ident),*), $query: expr, $req:expr)
+ =>
+ {{
+ paste!({
+ let body = parse_json_body::< [<$api RequestBody>], _, Error>($req).await?;
+ [< $api Request >] {
+ body,
+ $(
+ $param: router_match!(@@parse_param $query, $conv $(($conv_arg))?, $param),
+ )+
+ }
+ })
+ }};
+ (@@gen_parse_request $api:ident, ($($conv:ident $(($conv_arg:expr))? :: $param:ident),*), $query: expr, $req:expr)
+ =>
+ {{
+ paste!({
+ [< $api Request >] {
+ $(
+ $param: router_match!(@@parse_param $query, $conv $(($conv_arg))?, $param),
+ )+
+ }
+ })
+ }};
(@gen_parser ($keyword:expr, $key:ident, $query:expr, $header:expr),
key: [$($kw_k:ident $(if $required_k:ident)? $(header $header_k:expr)? => $api_k:ident $(($($conv_k:ident :: $param_k:ident),*))?,)*],
no_key: [$($kw_nk:ident $(if $required_nk:ident)? $(if_header $header_nk:expr)? => $api_nk:ident $(($($conv_nk:ident :: $param_nk:ident),*))?,)*]) => {{
@@ -85,7 +147,10 @@ macro_rules! router_match {
}};
(@@parse_param $query:expr, query, $param:ident) => {{
// extract mendatory query parameter
- $query.$param.take().ok_or_bad_request("Missing argument for endpoint")?.into_owned()
+ $query.$param.take()
+ .ok_or_bad_request(
+ format!("Missing argument `{}` for endpoint", stringify!($param))
+ )?.into_owned()
}};
(@@parse_param $query:expr, opt_parse, $param:ident) => {{
// extract and parse optional query parameter
@@ -99,10 +164,22 @@ macro_rules! router_match {
(@@parse_param $query:expr, parse, $param:ident) => {{
// extract and parse mandatory query parameter
// both missing and un-parseable parameters are reported as errors
- $query.$param.take().ok_or_bad_request("Missing argument for endpoint")?
+ $query.$param.take()
+ .ok_or_bad_request(
+ format!("Missing argument `{}` for endpoint", stringify!($param))
+ )?
.parse()
.map_err(|_| Error::bad_request("Failed to parse query parameter"))?
}};
+ (@@parse_param $query:expr, parse_default($default:expr), $param:ident) => {{
+ // extract and parse optional query parameter
+ // using provided value as default if paramter is missing
+ $query.$param.take().map(|x| x
+ .parse()
+ .map_err(|_| Error::bad_request("Failed to parse query parameter")))
+ .transpose()?
+ .unwrap_or($default)
+ }};
(@func
$(#[$doc:meta])*
pub enum Endpoint {
@@ -187,6 +264,7 @@ macro_rules! generateQueryParameters {
},
)*
$(
+ // FIXME: remove if !v.is_empty() ?
$f_param => if !v.is_empty() {
if res.$f_name.replace(v).is_some() {
return Err(Error::bad_request(format!(