1个稳定版本
1.0.0 | 2021年11月13日 |
---|
#493 in #automatic
1,141 每月下载量
用于 16 个crate(通过 tuirealm)
16KB
54 行
tuirealm_derive
~ 自动实现 MockComponent ~
由 @veeso 开发
当前版本:1.0.0 (2021/11/13)
关于 tuirealm_derive 👑
tuirealm_derive 是一个 crate,实现了过程宏 MockComponent
,可以用于自动为 tui-realm 的 Component
实现MockComponent 特性。实际上,如果你是 tui-realm 的用户,你已经知道,你有两种组件实体
- MockComponent:一个不与应用程序桥接的通用图形组件,是“可重用的”
- Component:它使用 MockComponent 作为“后端”,并使用 Event -> Msg 系统与应用程序桥接。
Component 将 MockComponent 以及额外的状态包装起来。例如
pub struct IpAddressInput {
component: Input,
}
impl MockComponent for IpAddressInput {
...
fn state(&self) -> State {
self.component.state()
}
...
}
impl Component<Msg, UserEvent> for IpAddressInput {
fn on(&mut self, ev: Event<UserEvent>) -> Option<Msg> {
let cmd: Cmd = match ev {
...
};
match self.perform(cmd) {
...
}
}
}
由于 Component
必须 实现 MockComponent
,因此我们还需要实现 MockComponent 特性,这在大多数情况下只是调用内部 component
字段的 MockComponet 方法。对于每个组件来说,这显然有些烦人。这就是为什么我实现了这个过程宏,它将自动在组件上实现这个逻辑。
所以基本上,你不需要为你的组件实现 MockComponent,只需这样做
#[derive(MockComponent)]
pub struct IpAddressInput {
component: Input,
}
impl Component<Msg, UserEvent> for IpAddressInput {
...
}
使用指令 #[derive(MockComponent)]
,我们 不需要 实现MockComponent 特性。
❗ 为了使过程宏正常工作,您需要将“内部”模拟组件命名为
component
,就像我在示例中做的那样。
如果我们深入查看宏,我们会看到它所做的事情是
impl MockComponent for IpAddressInput {
fn view(&mut self, frame: &mut Frame, area: Rect) {
self.component.view(frame, area);
}
fn query(&self, attr: Attribute) -> Option<AttrValue> {
self.component.query(attr)
}
fn attr(&mut self, query: Attribute, attr: AttrValue) {
self.component.attr(query, attr)
}
fn state(&self) -> State {
self.component.state()
}
fn perform(&mut self, cmd: Cmd) -> CmdResult {
self.component.perform(cmd)
}
}
开始使用 🏁
要开始使用 tuirealm_derive,您只需将 tui-realm 添加到您的依赖项中,并根据需要启用 derive
功能。
如果您使用的是默认功能
[dependencies]
tuirealm = "^1.0.0"
如果您没有使用默认功能,请确保启用 derive 功能
[dependencies]
tuirealm = { version = "^1.0.0", default-features = false, features = ["derive", "with-termion"] }
⚠️ tuirealm_derive 需要 tui-realm >= 1.0.0;旧 API 不受支持
然后您需要使用 宏 use
指令将 tuirealm 包含到您的项目中
src/lib.rs
#[macro_use]
extern crate tuirealm;
并在您的组件上最终派生 MockComponent
#[derive(MockComponent)]
pub struct MyComponent {
component: MyMockComponentImpl,
}
❗ 为了使过程宏正常工作,您需要将“内部”模拟组件命名为
component
,就像我在示例中做的那样。
好了,您就可以开始了 🎉
支持开发者 ☕
如果您喜欢 tui-realm 并感激我所做的工作,请考虑小额捐赠 🥳
您可以使用以下平台之一进行捐赠
更新日志 ⏳
查看 tuirealm_derive 的变更日志 这里
许可证 📃
tuirealm_derive 使用 MIT 许可证。
您可以在 这里 阅读整个许可证
依赖项
~1.5MB
~35K SLoC