mirror of
https://github.com/teloxide/teloxide.git
synced 2025-01-24 09:16:12 +01:00
Fix trailing comma issues in teloxide::handler!
This commit is contained in:
parent
45e7a4274c
commit
618be35803
1 changed files with 37 additions and 6 deletions
|
@ -190,11 +190,11 @@ where
|
||||||
/// (This next handler can be an endpoint or a more complex one.) The payload
|
/// (This next handler can be an endpoint or a more complex one.) The payload
|
||||||
/// format depend on the form of `MyVariant`:
|
/// format depend on the form of `MyVariant`:
|
||||||
///
|
///
|
||||||
/// - For `State::MyVariant(param)`, the payload is `param`.
|
/// - For `State::MyVariant(param)` and `State::MyVariant { param }`, the
|
||||||
/// - For `State::MyVariant(param1, ..., paramN)`, the payload is `(param1,
|
/// payload is `param`.
|
||||||
/// ..., paramN)` (where `N` > 1).
|
/// - For `State::MyVariant(param1, ..., paramN)` and `State::MyVariant {
|
||||||
/// - For `State::MyVariant { param1, ..., paramN }`, the payload is `(param1,
|
/// param1, ..., paramN }`, the payload is `(param1, ..., paramN)` (where `N`
|
||||||
/// ..., paramN)`.
|
/// > 1).
|
||||||
///
|
///
|
||||||
/// ## Dependency requirements
|
/// ## Dependency requirements
|
||||||
///
|
///
|
||||||
|
@ -216,6 +216,12 @@ macro_rules! handler {
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
($($variant:ident)::+ {$param:ident}) => {
|
||||||
|
$crate::dptree::filter_map(|state| match state {
|
||||||
|
$($variant)::+{$param} => Some($param),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
};
|
||||||
($($variant:ident)::+ {$($param:ident),+ $(,)?}) => {
|
($($variant:ident)::+ {$($param:ident),+ $(,)?}) => {
|
||||||
$crate::dptree::filter_map(|state| match state {
|
$crate::dptree::filter_map(|state| match state {
|
||||||
$($variant)::+ { $($param),+ } => Some(($($param),+ ,)),
|
$($variant)::+ { $($param),+ } => Some(($($param),+ ,)),
|
||||||
|
@ -259,6 +265,18 @@ mod tests {
|
||||||
assert!(matches!(h.dispatch(dptree::deps![State::Other]).await, ControlFlow::Continue(_)));
|
assert!(matches!(h.dispatch(dptree::deps![State::Other]).await, ControlFlow::Continue(_)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn handler_single_fn_variant_trailing_comma() {
|
||||||
|
let input = State::B(42);
|
||||||
|
let h = handler![State::B(x,)].endpoint(|(x,): (i32,)| async move {
|
||||||
|
assert_eq!(x, 42);
|
||||||
|
123
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_eq!(h.dispatch(dptree::deps![input]).await, ControlFlow::Break(123));
|
||||||
|
assert!(matches!(h.dispatch(dptree::deps![State::Other]).await, ControlFlow::Continue(_)));
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn handler_fn_variant() {
|
async fn handler_fn_variant() {
|
||||||
let input = State::C(42, "abc");
|
let input = State::C(42, "abc");
|
||||||
|
@ -275,7 +293,20 @@ mod tests {
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn handler_single_struct_variant() {
|
async fn handler_single_struct_variant() {
|
||||||
let input = State::D { foo: 42 };
|
let input = State::D { foo: 42 };
|
||||||
let h = handler![State::D { foo }].endpoint(|(x,): (i32,)| async move {
|
let h = handler![State::D { foo }].endpoint(|x: i32| async move {
|
||||||
|
assert_eq!(x, 42);
|
||||||
|
123
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_eq!(h.dispatch(dptree::deps![input]).await, ControlFlow::Break(123));
|
||||||
|
assert!(matches!(h.dispatch(dptree::deps![State::Other]).await, ControlFlow::Continue(_)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn handler_single_struct_variant_trailing_comma() {
|
||||||
|
let input = State::D { foo: 42 };
|
||||||
|
#[rustfmt::skip] // rustfmt removes the trailing comma from `State::D { foo, }`, but it plays a vital role in this test.
|
||||||
|
let h = handler![State::D { foo, }].endpoint(|(x,): (i32,)| async move {
|
||||||
assert_eq!(x, 42);
|
assert_eq!(x, 42);
|
||||||
123
|
123
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue