Skip to main content

sml_value/
lib.rs

1// SPDX-License-Identifier: MulanPSL-2.0
2//! SML 值模型 —— 整个 SML 生态的**地基 crate**,零依赖。
3//!
4//! 只承载三件事:
5//!
6//! 1. [`Value`]:7 种类型的枚举(`Null`/`Bool`/`Int`/`Float`/`Str`/`Array`/`Object`);
7//! 2. `to_sml`(feature `sml`):把 `Value` 渲染回 SML 文本;
8//! 3. serde 桥接(feature `serde`):`Value` 的 `Serialize`/`Deserialize`。
9//!
10//! 后两者必须留在本 crate:**孤儿规则**要求 `impl Display for Value`、
11//! `impl Serialize for Value` 与 `Value` 同 crate,而它们分别依赖
12//! `to_sml` 与类型描述函数。
13//!
14//! # 为什么要独立成 crate
15//!
16//! 解析器、契约、emit 后端、C-ABI 乃至 Crystalic(布局层)都只需要
17//! `Value`。若 `Value` 与它们同 crate,下游就被迫拖入全部代码
18//! (过程宏、C-ABI 导出、六个转译后端)。独立后:
19//!
20//! ```toml
21//! sml-value = "0.5"                                   # 只要值模型(嵌入式)
22//! sml-value = { version = "0.5", features = ["sml"] } # + 序列化回 SML
23//! ```
24
25mod value;
26#[cfg(feature = "sml")]
27mod dump;
28#[cfg(feature = "serde")]
29mod serde_bridge;
30
31pub use value::{describe_value, MAX_VALUE_DEPTH, Value};
32
33#[cfg(feature = "sml")]
34pub use dump::to_sml;
35
36/// serde 桥接函数(`Value` ↔ 任意 serde 类型)。
37#[cfg(feature = "serde")]
38pub mod serde {
39    pub use crate::serde_bridge::{from_value, to_string, to_value};
40}