#forms #web-gui #web-apps #web

structform

一个用于管理交互式表单的库,它使用类型系统来编码验证规则。

1 个不稳定版本

0.1.0 2021 年 2 月 11 日

#362GUI

MIT/Apache

24KB
380

StructForm

crates.io crates.io build status

一个用于管理交互式表单的库,它使用类型系统来编码验证规则。

为什么选择 StructForm

表单是许多程序中捕获数据的一种常见方式。在这些程序中,如果表单能对捕获的数据提供实时反馈,那就很棒了。此外,如果您有一个单独的前端和后端,它们通过 API 通信,那么保持前端和后端强制执行的验证规则相同是很好的。

Rust 有一个出色的类型系统。StructForm 旨在利用类型系统来提供实时反馈并强制执行验证规则。

StructForm 是针对遵循 Elm 架构的网络应用程序设计的(特别是我们使用 Seed),但它应该与任何前端框架很好地协同工作。

它是如何工作的?

一切从您想要表单表示的强类型数据版本开始。

#[derive(Default, Debug, PartialEq, Eq)]
struct LoginData {
    username: String,
    password: String,
}

这通过一个 Form 结构体反映出来,它派生自 StructForm 特性。

#[derive(Default, Clone, StructForm)]
#[structform(model = "LoginData")]
struct LoginForm {
    username: FormTextInput<String>,
    password: FormPasswordInput<String>,
}

这将做一些事情

  • 将创建一个枚举,例如本例中的 LoginFormField,它为每个输入都有一个案例。
  • 在您的表单上实现一个 set_input 函数,它接受字段枚举和一个字符串,并更新表单中适当字段。
  • 在您的表单上实现一个 submit 函数,它检查表单上的所有输入,并在可能的情况下创建您的强类型模型(本例中的 LoginData)。

在典型的网络表单中,这是如何连接起来的

  • 为表单中的每个字段创建一个 HTML 输入。
  • 为输入添加一个监听器,以调用您的表单的 set_input,并监听 input 事件。方便的是,只要您的输入传递来自表单字段枚举的适当值,所有输入都可以使用相同的事件回调。
  • 为您的 HTML 表单添加一个监听器,以监听 submit 事件,该事件在表单上调用 submit,如果 submit 成功,则将数据发送到 API。

学习使用 StructForm 的最佳方法就是查看 示例

表单输入

StructForm 与众不同,它不自带表单输入。相反,它提供了宏,您可以使用这些宏来生成自己的表单输入。这使得您能够指定应用程序中使用的输入类型,以及这些不同输入如何将最终用户输入的字符串转换为强类型数据。

创建表单输入的基本方法是通过调用 derive_form_input 宏。

derive_form_input! {MyFormInput}

这将为您创建一个名为 MyFormInput 的结构体,它有一个与您的 UI 相关联的 input 字符串。现在,您可以指定 MyFormInput 如何处理任何模型类型,包括是否要修剪输入字符串等细节。

impl ParseAndFormat<MyInputModel> for MyFormInput<Model> {
    fn parse(value: &str) -> Result<MyInputModel, ParseError> { todo!() }
    fn format(value: &MyInputModel) -> String { todo!() }
}

有关 ParseAndFormat 的常见实现,请参阅宏 impl_text_input_with_stringopsimpl_numeric_input_with_stringops

验证

验证应该通过使表单输入包装的类型强制执行验证规则来添加。使用 newtype 模式 是添加这些规则的一个绝佳方法。请参阅 验证规则示例,了解如何实现这一点。

示例

许可证

许可方式为以下之一

任选其一。

依赖项

~1.5MB
~35K SLoC