#convex #macro #validation #help #nice #schema #model

ragkit_convex_macros

帮助使Rust中的Convex变得更好的宏

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 过程宏

MIT 许可证

37KB
807

convex-macros

CI Badge License Badge Crates.io Badge

帮助使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::Valueserde_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 标识符,因此像 类型 这样的关键词不能作为字段名称。将其映射到 _typekindt 等。
  • 联合变体名称始终命名为: Variant1Variant2 等。
  • 如果有多个可以合法解析数据的分支,则将使用第一个可接受的联合分支。
  • 此包生成的代码期望 anyhowconvexserdeserde_json 可用。
  • 整数和浮点数可以相互强制转换。请测试您的用例,如果您认为行为应该改变,请提交问题。

许可

MIT

依赖项

~295–750KB
~18K SLoC