1 个不稳定版本
0.1.0 | 2021 年 2 月 11 日 |
---|
#362 在 GUI
24KB
380 行
StructForm
一个用于管理交互式表单的库,它使用类型系统来编码验证规则。
为什么选择 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_stringops
和 impl_numeric_input_with_stringops
。
验证
验证应该通过使表单输入包装的类型强制执行验证规则来添加。使用 newtype 模式 是添加这些规则的一个绝佳方法。请参阅 验证规则示例,了解如何实现这一点。
示例
许可证
许可方式为以下之一
- Apache License,版本 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖项
~1.5MB
~35K SLoC