Expand description
SML — SNOWARE Markup Language (Rust 实现, crate 名 sml)
声明式数据/配置格式, JSON/YAML 的替代品。语法与 Soup 生态的
lib/sml.soup (Lua) 对齐:
firstName: John
age: 27
address:
{
streetAddress: "21 2nd Street"
state: NY
}
phoneNumbers: [ { type: home } { type: office } ]
@base { region: cn-north-1 }
server web { &base port: 8080 }特性:
- 引号可选 (裸词即字符串)
- 块冒号可省 (
address { }≡address: { }) - 数组分隔灵活 (逗号可选)
- 片段继承 (
@name { }定义 /&name引用) include "path"引入外部文件(见parse_file)$env.VAR环境变量内联#行注释- 类型自识别: true/false -> bool, null -> None, 数字 -> i64/f64, 其余 -> String
值模型: Value 枚举 (与 JSON 同构, 另加 __type/__name 裸块元数据)。
§纯解析 vs 文件解析
parse 是纯函数(只吃字符串,不做 IO),因此不含 include 处理。
需要 include 时用 parse_file,它会先展开指令再交给 parse。
这样设计保证了 parse 的可嵌入性(如 WASM / 沙箱内无文件系统)。
§Cargo features
serde(默认关闭):Value实现Serialize/Deserialize,可与 serde_json / serde_yaml / toml 等任意 serde 后端互通;同时提供 [serde::from_str] / [serde::from_value] / [serde::to_value] / [serde::to_string] 桥接函数,任何#[derive(serde::Deserialize)]类型都能像 toml-rs 一样一键从 SML 反序列化(无需SmlDeserialize)。derive(默认开启):提供SmlSerialize/SmlDeserialize两个 derive 宏,把自定义结构体/枚举「自然地」序列化为 SML, 无需引入 serde。
sml-rs = { version = "0.2", features = ["serde"] }
# 不需要宏时可关闭默认 feature,回到完全零依赖:
sml-rs = { version = "0.2", default-features = false }Structs§
- CSml
Error - 与
sml_rs.h的sml_error一一对应。 - CSml
Value - 值树句柄。
repr(transparent)使其与内部Value布局一致, 从而可以把子值的&Value安全地重解释为此类型的借用指针。 - Contract
- 契约(schema):一组字段规格
- Feature
Set - 位掩码形式的特性集合。
- Field
Spec - 契约中的字段规格
- Include
Target - 单个 include 目标的解析结果。
- Parse
Error
Enums§
- CSml
Errc - 与
sml_rs.h的sml_errc一一对应。 - Feature
- 单个特性标识。与
FEATURES表一一对应;改表即改全端。 - Type
Spec - 契约中的字段类型
- Value
- Version
- SML 语法版本
Statics§
- FEATURES
- 特性名 → 枚举 的注册表。所有端共用同一组名字,保证跨语言一致。
Traits§
- SmlDeserialize
- 从 SML 值反序列化(
#[derive(SmlDeserialize)]自动实现)。 - SmlSerialize
- 把一个类型「自然地」序列化为 SML 值:
结构体 → 块、newtype → 透明、单元结构体 → 裸词、
枚举单元变体 → 裸词、带数据变体 →
__type块。
Functions§
- feature_
names - 返回全部已注册特性的名字,顺序与
FEATURES(即特性位序)一致。 - from_
str - 解析 SML 文本并反序列化 —— toml-rs 风格的顶层函数(等价于
SmlDeserialize::from_sml)。 - loads
- 解析到对象 (失败抛
ParseError) - parse
- 解析 SML 文本
- parse_
allowed - 解析 SML 文本,并限制文档声明的版本必须在
allowed范围内。 - parse_
file - 解析 SML 文件,并展开其中的 include 指令。
- parse_
file_ versioned - 解析 SML 文件:展开 include,并返回其声明的语法版本
- parse_
versioned - 解析 SML 文本,并返回其声明的语法版本。
- parse_
with_ features - 解析 SML 文本,同时限制文档使用的特性子集必须在
allowed内。 - resolve_
includes - 把 text 中的 include 指令递归展开为不含指令的纯 SML 文本。
- sml_at⚠
- 取数组第
idx个元素(借用,不可释放)。 - sml_
bool_ ⚠in sml_get_path+sml_bool_value,经ok回传是否取到(可为 NULL)。- sml_
bool_ ⚠value - 布尔取值;非布尔返回 0。
- sml_
dump - sml_dump(json) -> 接受 JSON 字符串, 序列化为 SML; 调用方 sml_free
- sml_
dumps ⚠ - 把值树序列化为 SML 文本(调用方
sml_free_str释放)。 - sml_
feature_ name - 返回该特性位对应的名字(静态字符串,无需释放);越界返回 NULL。
- sml_
features - sml_features() -> 当前支持的特性名 JSON 数组 (调用方 sml_free)。 例: [“include”,“env”,“contract”,“glob-include”, …]
- sml_
features_ mask - 返回受支持特性的位掩码(可直接与
SML_F_*按位与)。 - sml_
free ⚠ - 释放
sml_loads/sml_load_file返回的根节点(NULL 安全)。 - sml_
free_ ⚠str - sml_free_str(p): 释放由 sml_parse / sml_dump / sml_dumps 等返回的字符串。
- sml_get⚠
- 取对象字段(借用,不可释放);键不存在或类型不符返回 NULL。
- sml_
get_ ⚠path - 按
.分隔路径逐层取值(借用,不可释放)。 - sml_
int_ ⚠in sml_get_path+sml_int_value,经ok回传是否取到(可为 NULL)。- sml_
int_ ⚠value - 整数取值;非整数返回 0(用
sml_typeof先判别类型)。 - sml_
load_ ⚠file - 解析 SML 文件为值树(展开
include,相对路径以文件所在目录为基准)。 - sml_
loads ⚠ - 解析 SML 文本为值树。
- sml_
parse - sml_parse(text) -> 返回 JSON 字符串 (调用方 sml_free 释放); 失败返回 NULL
- sml_
parse_ ex - sml_parse_ex(text, opts_json) -> JSON 字符串 (调用方 sml_free) 或 NULL。
- sml_
parse_ file - sml_parse_file(path) -> JSON 字符串 (调用方 sml_free) 或 NULL。 桥接内部 parse_file: 自动处理 include / glob / @contract 校验, 带文件上下文。
- sml_
real_ ⚠value - 浮点取值;非数值返回 0.0。
- sml_
size ⚠ - 元素个数(数组长度 / 对象字段数);其它类型返回 0。
- sml_
str_ ⚠copy - 把字符串值拷进调用方缓冲区,返回不含 NUL 的长度;缓冲区不足时返回所需长度。
- sml_
str_ ⚠dup - 字符串值的新分配副本(调用方
sml_free_str释放);非字符串返回 NULL。 - sml_
str_ ⚠in sml_get_path+sml_str_dup的合体(调用方sml_free_str释放)。- sml_
typeof ⚠ - 值类型判别,返回
sml_type枚举值;NULL 或非预期返回 -1。 - sml_
version - sml_version() -> 版本静态字符串(无需释放,与 jansson 的
jansson_version_str()语义一致)。 - sml_
version_ str - 库版本字符串(调用方
sml_free_str释放)。 - to_sml
- 序列化回 SML 文本 (round-trip)
- to_
string - 序列化为 SML 文本 —— toml-rs 风格的顶层函数(等价于
SmlSerialize::to_sml)。