// 1. 定义 Schema
let project = @moonguard.obj([
@moonguard.field("name", @moonguard.str(min_len=1)),
@moonguard.field("stars", @moonguard.num(min=0.0, integer=true)),
@moonguard.field("tags", @moonguard.arr(@moonguard.str(), min_items=1)),
@moonguard.opt_field("homepage", @moonguard.str(format="url")),
@moonguard.field_or("license", @moonguard.str(), @moonguard.v_str("MIT")),
])
// 2. 解析 + 校验一步完成
let text = "{\"name\": \"MoonBit\", \"stars\": 10000, \"tags\": [\"wasm\"]}"
match project.validate_json(text) {
Ok(v) => println(v.stringify(indent=2)) // license 已按默认值填充
Err(issues) => for issue in issues { println(issue.to_string()) }
}
校验失败时的输出形如:
$.name: expected at least 1 characters, got 0 [min_length]
$.stars: expected an integer value [not_integer]
$.tags: expected at least 1 items, got 0 [min_items]
$.homepage: expected a valid url [format]
MoonGuard
MoonGuard 是一个零依赖的 MoonBit 库,把「解析 JSON」和「校验数据结构」合并成一条流水线:从一段 JSON 文本出发,经过解析、结构校验、默认值填充,得到一个可以放心使用的值,或者一份带精确路径定位的问题清单。
适用场景:配置文件加载与校验、API 请求 / 响应体校验、表单数据校验、以及任何”外部输入不可信”的边界处理。
特性
\uXXXX与代理对)、科学计数法、嵌套结构,错误带行列定位str/num/obj/arr/union/nullable/recursive等构造函数自由组合$.user.tags[2]形式的路径 + 稳定错误码 + 可读消息,一次校验收集全部问题而非遇错即停安装
然后在需要使用的包的
moon.pkg.json中引入:快速上手
校验失败时的输出形如:
API 一览
解析与序列化
parse(text)Result[Value, ParseError]Value::stringify(indent?)indent=2输出美化格式v_null()/v_bool/v_num/v_str/v_arr/v_objValueValue::as_str/as_num/as_bool/as_arr/as_objValue::get_key/get_indexValue::equalsValue::type_nameSchema 构造
str(min_len?, max_len?, format?)emailurluuidipv4datenum(min?, max?, integer?)/int_num(min?, max?)boolean()/null_()/literal(v)arr(elem, min_items?, max_items?)tuple(items)obj(fields, allow_extra?)allow_extra=false拒绝未声明的键field/opt_field/field_ormap_of(values, min_size?, max_size?)union(options)nullable(inner)refine(base, predicate, code, message)recursive(make)执行校验
Schema::validate(value)Value,返回Result[Value, Array[Issue]]Schema::validate_json(text)Schema::is_valid(value)Issuepath+code+message,to_string()渲染为一行path_to_string(path)$.a[0].b形式路径错误码
type_mismatchmin_lengthmax_lengthformatunknown_formatminmaxnot_integermin_itemsmax_itemstuple_aritymissing_fieldunknown_fieldmin_sizemax_sizeunion_mismatchliteral_mismatchparse_error以及refine的自定义码。错误码是稳定 API,可用于程序化处理(如 i18n)。运行示例与测试
功能边界
以下是有意为之的设计边界,便于使用者准确预期:
Double表示(与 JavaScript 一致),不提供任意精度数值integer约束在 Int 可精确表示的范围内判断,绝对值超过 2^52 的浮点数视为整数项目结构
路线图
许可证
MIT
致谢
Schema API 的设计参考了 Zod(TypeScript)的使用体验,但本库为独立实现,未移植其代码。