QuietlyChan/moonschema/schema does not have a README file

    CompileError

    pub(all) suberror CompileError {
    InvalidSchema(String, String)
    UnsupportedKeyword(String, String)
    } derive(Eq)

    模式文档本身不合法时抛出的错误(区别于"实例校验失败")。

    CompileOptions

    pub struct CompileOptions {
    strict : Bool
    assert_format : Bool
    locale : Locale
    } derive(Eq)

    编译选项(见 compile)。

    CompileOptions::new

    fn CompileOptions::new(strict? : Bool, assert_format? : Bool, locale? : Locale) -> CompileOptions

    Ctx

    type Ctx

    编译上下文:根文档 + $ref 惰性编译缓存(支持递归模式)。

    JsonType

    pub(all) enum JsonType {
    JTNull
    JTBoolean
    JTObject
    JTArray
    JTNumber
    JTString
    JTInteger
    } derive(Eq)

    JSON Schema 2020-12 认可的实例类型。 JTInteger 不是独立的 JSON 类型,而是 "number 且没有小数部分" 的约束。

    Locale

    pub(all) enum Locale {
    EN
    ZH
    } derive(Eq)

    校验错误消息的语言(影响实例校验失败的消息文本; 模式编译错误面向开发者,始终为英文)。

    Node

    type Node

    编译后的模式节点。

    Schema

    pub struct Schema {
    node : Node
    ctx : Ctx
    }

    已编译的 Schema(对应 ajv 的 compiled schema):不可变、可跨请求复用。

    Schema::check

    fn Schema::check(self : Schema, instance : Json) -> Bool

    便捷方法:实例是否通过校验。

    Schema::validate

    fn Schema::validate(self : Schema, instance : Json) -> Array[ValidationError]

    校验一个 JSON 实例,返回全部错误;空数组表示通过。

    对应 ajv 的 validate + errors
    let v = compile(schema)
    let errors = v.validate(instance)
    if errors.length() > 0 { println(summarize(errors)) }

    ValidationError

    pub(all) struct ValidationError {
    keyword : String
    instance_path : String
    schema_path : String
    message : String
    } derive(Eq, ToJson)

    实例校验失败的一条错误。

    • keyword:触发错误的关键词,如 "required"
    • instance_path:出错数据的位置(RFC 6901 JSON Pointer,如 "/address/zip"
    • schema_path:触发错误的关键词在模式中的位置(如 "#/properties/age/minimum"
    • message:人类可读的错误描述(ajv 风格英文消息)

    compile

    fn compile(schema : Json, options? : CompileOptions) -> Schema raise CompileError

    ajv 风格入口:把一份 JSON Schema 文档编译为可复用的 Schema

    布尔模式 true / false 也是合法的 schema(2020-12)。

    let v = compile(
    @json.parse!(#|{ "type": "string", "minLength": 1 }#|),
    )
    v.check(Json::string("hi")) // true

    parse

    fn parse(text : String) -> Json raise
    ParseError

    便捷入口:解析 JSON 文本为 Json 值(转发到 @json.parse)。

    让使用者只依赖本包即可完成 "解析 → 编译 → 校验" 全流程。

    summarize

    fn summarize(errors : Array[ValidationError]) -> String

    把错误列表渲染为多行文本,适合日志输出与测试快照。