tree_sitter_utils/combinators/when.rs
1//! The [`When`] combinator — guard a handler with a predicate.
2
3use crate::handler::{Handler, HandlerResult};
4use crate::input::Input;
5use crate::predicates::NodePredicate;
6
7/// A handler that runs `inner` only when `pred` returns `true`.
8///
9/// Constructed via [`HandlerExt::when`](crate::HandlerExt::when) or the
10/// sugar [`HandlerExt::for_kinds`](crate::HandlerExt::for_kinds).
11///
12/// # Example
13///
14/// ```rust
15/// use tree_sitter_utils::{handler_fn, HandlerExt, kind_is};
16///
17/// let h = handler_fn(|_: tree_sitter_utils::Input<()>| "hit".to_owned())
18/// .when(kind_is(&["identifier"]));
19/// let _ = h;
20/// ```
21pub struct When<H, P> {
22 /// The guarded handler.
23 pub inner: H,
24 /// The predicate gate.
25 pub pred: P,
26}
27
28impl<Ctx, R, H, P> Handler<Ctx, R> for When<H, P>
29where
30 H: Handler<Ctx, R>,
31 P: NodePredicate<Ctx>,
32 Ctx: Copy,
33{
34 #[inline]
35 fn handle<'tree>(&self, input: Input<'tree, Ctx>) -> HandlerResult<R> {
36 if self.pred.test(input) {
37 self.inner.handle(input)
38 } else {
39 None
40 }
41 }
42}