4个版本
0.0.4 | 2024年3月19日 |
---|---|
0.0.3 | 2024年3月19日 |
0.0.2 | 2024年3月19日 |
0.0.1 | 2024年3月19日 |
#228 in 过程宏
37KB
807 行
convex-macros
帮助使Rust中的Convex变得更好的宏
安装
[dependencies]
ragkit_convex_macros = "0.0.4"
# Required by code this macro generates.
anyhow = "1.0.80"
convex = "0.6.0"
serde = "1.0.185"
serde_json = "1.0"
用法
使用与您的模式定义相同的Convex验证器语法创建模型。
convex_model!(User {
_id: v.id("users"),
name: v.string(),
age: v.optional(v.int64()),
platform: v.union(
v.object({
platform: v.literal("google"),
verified: v.boolean(),
}),
v.object({
platform: v.literal("github"),
username: v.string(),
}),
),
});
这生成pub struct User {
,以及从convex::Value
和serde_json::Value
转换的方法。
let user = User::from_convex_value(&Value::Object(btreemap! {
"_id".into() => Value::String("1234".into()),
"name".into() => Value::String("Alice".into()),
"age".into() => Value::Int64(42),
"platform".into() => Value::Object(btreemap! {
"platform".into() => Value::String("github".into()),
"username".into() => Value::String("alicecodes".into()),
}),
}))
.expect("it should parse");
assert_eq!("1234", user._id);
assert_eq!("alicecodes", user.platform.as_2().unwrap().username);
assert_eq!(
json!({
"_id": "1234",
"name": "Alice",
"age": 42,
"platform": {
"platform": "github",
"username": "alicecodes",
},
}),
json!(user),
);
功能
let user = User::from_convex_value(value)?;
将值从Convex客户端解析。json!(user)
将其序列化为JSON。- 自动处理区分联合。
- 为每个联合分支提供辅助函数:
user.platform.as_2()?.username
。
验证器列表
验证器名称 | Rust类型 | 备注 |
---|---|---|
v.string() |
String |
|
v.id("tableName") |
String |
Ids不与您的表进行验证 |
v.null() |
() |
|
v.int64() |
i64 |
|
v.number() |
f64 |
|
v.boolean() |
bool |
|
v.optional(...) |
Option<T> |
|
v.union(...) |
生成的enum |
|
v.object({field: ...}) |
生成 结构体 |
字段名称不能是 Rust 关键词(例如 类型 ) |
v.字节() |
尚未实现 | |
v.数组(值) |
尚未实现 | |
v.任何() |
尚未实现 |
限制
- 这是实验性的,可能不是“生产质量”,请谨慎使用。
v.bytes()
、v.array()
、v.any()
还不支持。- 字段名称必须是有效的 Rust 标识符,因此像
类型
这样的关键词不能作为字段名称。将其映射到_type
、kind
、t
等。 - 联合变体名称始终命名为:
Variant1
、Variant2
等。 - 如果有多个可以合法解析数据的分支,则将使用第一个可接受的联合分支。
- 此包生成的代码期望
anyhow
、convex
、serde
和serde_json
可用。 - 整数和浮点数可以相互强制转换。请测试您的用例,如果您认为行为应该改变,请提交问题。
许可
MIT
依赖项
~295–750KB
~18K SLoC