A pure MoonBit reader and writer for a documented subset of libconfig 1.8.2
moon add Ryan-1125/moonlibconfig@0.2.0import {
"Ryan-1125/moonlibconfig" @config,
} for "test"///|
test "read edit and write service configuration" {
let source = @config.parse(
"service={port=9000;enabled=true;} peers=({host=\"localhost\";weight=1L;})",
)
assert_eq(source.lookup("service.port").as_int(), 9000)
assert_eq(source.lookup("peers[0].host").as_string(), "localhost")
assert_eq(source.lookup("peers.[0].weight").as_int64(), 1L)
let service = source.lookup("service").with_member("workers", @config.Integer(4))
let changed = source
.replaced(@config.parse_path("service"), service)
.replaced(@config.parse_path("service.port"), @config.Integer(8080))
let output = @config.stringify(changed)
let reloaded = @config.parse(output)
assert_eq(reloaded.lookup("service.port").as_int(), 8080)
assert_eq(reloaded.lookup("service.workers").as_int(), 4)
assert_eq(source.lookup("service.port").as_int(), 9000)
let removed = service.without_member("workers")
assert_eq(removed, source.lookup("service"))
}moon test| 能力 | 接口 |
|---|---|
| 文本/字节解析 | parse、parse_bytes |
| 规范化写出 | stringify |
| 路径解析与查询 | parse_path、lookup、get_path |
| 成员与索引查询 | get_member、at |
| 配置编辑 | replaced、with_member、without_member |
| 列表/数组编辑 | inserted、appended、removed_at |
| 独立校验 | validate,返回带路径的 ValidationIssue 数组 |
| 源位置与类型诊断 | parse_document、parse_document_bytes、Document.location、Document.get_* |
| 类型提取 | as_int、as_int64、as_double、as_bool、as_string、as_bytes |
| 类型名称 | kind |
///|
test "handle a missing setting" {
let root = @config.parse("port=9000")
let code = try {
ignore(root.lookup("missing"))
"accepted"
} catch {
@config.ConfigError(d) => d.code
}
assert_eq(code, "missing_member")
}| 限制 | 默认值 |
|---|---|
| 输入/规范化输出 | 1 MiB |
| 容器嵌套 | 64层,根 group 不计入 |
| 值节点 | 100000个,根 group 不计入 |
| 解码后单字符串 | 256 KiB |
| 查询/替换路径 | 256段 |
///|
test "apply explicit resource limits" {
let limits = { ..@config.Limits::default(), max_input: 4096, max_depth: 16 }
let root = @config.parse("port=9000", limits~)
assert_eq(root.lookup("port").as_int(), 9000)
assert_eq(@config.parse(@config.stringify(root, limits~)), root)
}git clone https://github.com/Ryan-1125/moonlibconfig.git
cd moonlibconfig
moon update
moon run examples/service --target wasm-gc| 验证项 | 结果 |
|---|---|
| 核心与边界测试 | 40项,覆盖三后端 |
| GitHub Actions | Ubuntu、Windows:检查、三后端构建/测试、示例、API及打包 |
| 真实上游差分 | 140个输入,8项精确记录的差异 |
| 共同范围双向读写 | 110个输入通过 |
| 实际 ZIP 独立消费 | Wasm GC、JS、Windows native 通过 |
| Mooncakes 0.2.0 独立消费 | 注册表下载安装及三后端 API 调用通过 |
moon fmt --check
moon check --deny-warn
moon test --target wasm-gc --deny-warn
moon test --target js --deny-warn
moon test --target native --deny-warn
moon info
moon package --list///|
test "edit validate and locate configuration" {
let doc = @config.parse_document("service={port=9000;} peers=(\"one\",\"two\")")
assert_eq(doc.get_int("service.port"), 9000)
assert_true(doc.location("service.port") != None)
let peers = doc.lookup("peers")
.inserted(1, @config.Text(b"backup"))
.appended(@config.Text(b"last"))
.removed_at(0)
let root = doc.root().replaced(@config.parse_path("peers"), peers)
assert_eq(@config.validate(root), [])
assert_eq(@config.parse(@config.stringify(root)), root)
let invalid = @config.Group([
("ports", @config.ScalarArray([@config.Integer(1), @config.Integer64(2L)])),
])
let issues = @config.validate(invalid)
assert_eq(issues[0].path, "ports[1]")
assert_eq(issues[0].code, "array_type")
}Install
Download zipA pure MoonBit reader and writer for a documented subset of libconfig 1.8.2