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, V = ()>(bool, Box<dyn FnMut(T) -> V + Send + Sync + 'a>);
17
18impl<T, V> Handler<'_, T, V>
19where
20    V: Default,
21{
22    pub fn is_default(&self) -> bool {
23        self.0
24    }
25
26    pub fn take(&mut self) -> Self {
27        core::mem::take(self)
28    }
29}
30
31impl<'a, T, V> Default for Handler<'a, T, V>
32where
33    V: Default,
34{
35    fn default() -> Self {
36        Self(true, Box::new(|_| V::default()))
37    }
38}
39
40impl<'a, F, T, V> From<F> for Handler<'a, T, V>
41where
42    F: FnMut(T) -> V + Send + Sync + 'a,
43{
44    fn from(f: F) -> Self {
45        Self(false, Box::new(f))
46    }
47}
48
49impl<'a, T, V> Deref for Handler<'a, T, V> {
50    type Target = Box<dyn FnMut(T) -> V + Send + Sync + 'a>;
51
52    fn deref(&self) -> &Self::Target {
53        &self.1
54    }
55}
56
57impl<'a, T, V> DerefMut for Handler<'a, T, V> {
58    fn deref_mut(&mut self) -> &mut Self::Target {
59        &mut self.1
60    }
61}