#component #tui #terminal #automatic #traits #macro #mock-component

过程宏 tuirealm_derive

自动实现 MockComponent 特性的过程宏

1个稳定版本

1.0.0 2021年11月13日

#493 in #automatic

Download history 315/week @ 2024-04-07 321/week @ 2024-04-14 297/week @ 2024-04-21 551/week @ 2024-04-28 316/week @ 2024-05-05 308/week @ 2024-05-12 274/week @ 2024-05-19 250/week @ 2024-05-26 374/week @ 2024-06-02 349/week @ 2024-06-09 297/week @ 2024-06-16 246/week @ 2024-06-23 240/week @ 2024-06-30 198/week @ 2024-07-07 372/week @ 2024-07-14 313/week @ 2024-07-21

1,141 每月下载量
用于 16 个crate(通过 tuirealm

MIT 许可证

16KB
54

tuirealm_derive

~ 自动实现 MockComponent ~

开始使用 · tui-realm · 文档

@veeso 开发

当前版本:1.0.0 (2021/11/13)

License-MIT Repo stars Downloads counter Latest version Buy me a coffee

Build CI Docs


关于 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 并感激我所做的工作,请考虑小额捐赠 🥳

您可以使用以下平台之一进行捐赠

Buy-me-a-coffee PayPal


更新日志 ⏳

查看 tuirealm_derive 的变更日志 这里


许可证 📃

tuirealm_derive 使用 MIT 许可证。

您可以在 这里 阅读整个许可证

依赖项

~1.5MB
~35K SLoC