Skip to main content

ratatui_kit/components/
send_block.rs

1//! [`SendBlock`]:`Option<Block>` 的 `Send + Sync` 包装。
2//!
3//! ratatui 0.30 起 `Block` 内含 `Arc<dyn CellEffect>`(自定义阴影效果的类型擦除句柄)
4//! 而不再是 `Send + Sync`。但 ratatui-kit 的 [`Props`](crate::Props) /
5//! [`Component`](crate::Component) 均要求 `Send + Sync`——组件的 `wait()` 经
6//! `BoxFuture`(Send)轮询(见 `render/tree.rs`),`use_future` 也要求 `F: Send`。
7//! 框架已对类型擦除后的 props 统一以 `unsafe impl Send/Sync for AnyProps` 承担线程安全
8//! (见 `props.rs`),本包装沿用同一设计,使含 `Block` 的 props/组件重新满足 `Send + Sync`。
9
10use ratatui::widgets::Block;
11use std::ops::{Deref, DerefMut};
12
13/// `Option<Block>` 的 `Send + Sync` 包装,供组件 props/字段承载可选边框。
14///
15/// 通过 [`Deref`] 暴露内部 `Option<Block>`(故 `.is_some()`/`.as_ref()` 等照常可用),
16/// 并提供 `From<Block>` 与 `From<Option<Block>>`;配合 `element!` 宏对字段值自动 `.into()`,
17/// 书写方式与原 `Option<Block<'static>>` 字段完全一致(如 `block: Block::bordered()...`)。
18#[derive(Default, Clone, Debug)]
19pub struct SendBlock(pub Option<Block<'static>>);
20
21// Safety: 见模块文档。ratatui-kit/上层应用构造的 `Block` 不挂自定义阴影效果
22// (`Effect` 为 `Overlay`/`Symbol`,不含 `Arc<dyn CellEffect>`),内部 `Block` 实际即为
23// `Send + Sync`;且组件树仅在单线程渲染路径中访问,断言成立。
24unsafe impl Send for SendBlock {}
25unsafe impl Sync for SendBlock {}
26
27impl Deref for SendBlock {
28    type Target = Option<Block<'static>>;
29    fn deref(&self) -> &Self::Target {
30        &self.0
31    }
32}
33
34impl DerefMut for SendBlock {
35    fn deref_mut(&mut self) -> &mut Self::Target {
36        &mut self.0
37    }
38}
39
40impl From<Block<'static>> for SendBlock {
41    fn from(block: Block<'static>) -> Self {
42        Self(Some(block))
43    }
44}
45
46impl From<Option<Block<'static>>> for SendBlock {
47    fn from(block: Option<Block<'static>>) -> Self {
48        Self(block)
49    }
50}