ratatui_kit/
handler.rs

1/// 通用事件处理器类型,封装 FnMut 回调闭包,支持动态替换和默认空实现。
2///
3/// - 可用于组件 props 的事件回调(如 on_change、on_click 等)。
4/// - 支持通过 `Handler::from` 包装任意闭包。
5/// - `is_default()` 判断是否为默认空实现。
6/// - `take()` 获取并重置 handler。
7/// - 实现 Deref/DerefMut,可直接调用闭包。
8///
9/// # 示例
10/// ```rust
11/// let mut handler = Handler::from(|val| println!("changed: {}", val));
12/// handler("hello");
13/// ```
14use core::ops::{Deref, DerefMut};
15
16pub struct Handler<'a, T>(bool, Box<dyn FnMut(T) + Send + Sync + 'a>);
17
18impl<T> Handler<'_, T> {
19    pub fn is_default(&self) -> bool {
20        !self.0
21    }
22
23    pub fn take(&mut self) -> Self {
24        core::mem::take(self)
25    }
26}
27
28impl<'a, T> Default for Handler<'a, T> {
29    fn default() -> Self {
30        Self(false, Box::new(|_| {}))
31    }
32}
33
34impl<'a, F, T> From<F> for Handler<'a, T>
35where
36    F: FnMut(T) + Send + Sync + 'a,
37{
38    fn from(f: F) -> Self {
39        Self(false, Box::new(f))
40    }
41}
42
43impl<'a, T> Deref for Handler<'a, T> {
44    type Target = Box<dyn FnMut(T) + Send + Sync + 'a>;
45
46    fn deref(&self) -> &Self::Target {
47        &self.1
48    }
49}
50
51impl<'a, T> DerefMut for Handler<'a, T> {
52    fn deref_mut(&mut self) -> &mut Self::Target {
53        &mut self.1
54    }
55}