ratatui_kit/hooks/
use_future.rs

1use std::task::Poll;
2
3use futures::future::BoxFuture;
4
5use super::{Hook, Hooks};
6
7mod private {
8    pub trait Sealed {}
9
10    impl Sealed for crate::hooks::Hooks<'_, '_> {}
11}
12
13pub trait UseFuture: private::Sealed {
14    fn use_future<F>(&mut self, f: F)
15    where
16        F: Future<Output = ()> + Send + 'static;
17}
18
19pub struct UseFutureImpl {
20    f: Option<BoxFuture<'static, ()>>,
21}
22
23impl UseFutureImpl {
24    pub fn new<F>(f: F) -> Self
25    where
26        F: Future<Output = ()> + Send + 'static,
27    {
28        UseFutureImpl {
29            f: Some(Box::pin(f)),
30        }
31    }
32}
33
34impl Hook for UseFutureImpl {
35    fn poll_change(
36        mut self: std::pin::Pin<&mut Self>,
37        cx: &mut std::task::Context,
38    ) -> std::task::Poll<()> {
39        if let Some(future) = self.f.as_mut() {
40            if future.as_mut().poll(cx).is_ready() {
41                self.f = None; // 清除已完成的 future
42            }
43        }
44        Poll::Pending
45    }
46}
47
48impl UseFuture for Hooks<'_, '_> {
49    fn use_future<F>(&mut self, f: F)
50    where
51        F: Future<Output = ()> + Send + 'static,
52    {
53        self.use_hook(move || UseFutureImpl::new(f));
54    }
55}