#markup-language #schema #human-readable #loading #format #baggins

sml

为加载配置文件和模式优化的简单标记语言

44个发布版本

0.1.46 2019年4月17日
0.1.45 2019年4月15日
0.1.6 2019年3月31日

编码分类中排名第1138

Download history 75/week @ 2024-03-31

每月下载量92

MIT许可证

43KB
735

SML

Build Status

SML是一种简单标记语言,旨在将人类可读信息转换为Rust类型,具有将配置文件和模式加载为特定目的。

该格式看起来像

hobbit:
    name:           Frodo Baggins
    age:            98
    friends:
        hobbit:
            name:   Bilbo Baggins
            age:    176
        hobbit:
            name:   Samwise Gamgee
            age:    66

数据格式规则

  1. 缩进有意义,为4个空格,相对于顶级键。如果缩进相对于顶级键,则可以整齐地对齐代码中嵌入的字符串。

  2. 所有值都必须使用双引号。

  3. 键/值组合用于字段

name: "Frodo"

用于struct字段和enum变体。仅键

hobbit:
    name: "Frodo"

表示完整的structenum。这样,数据清楚地指示了与Rust数据结构的映射。

  1. 行之间的分隔有意义。

  2. 键不得包含冒号:,但必须跟在冒号后面。

  3. 值中的双引号必须使用\"进行转义。

  4. 第二个双引号之后的所有内容都将被忽略。

  5. 空行或仅包含空白的行将被忽略。

  6. 注释需要在行首使用//,例如

// comment
hobbit:
    name: "Frodo"

示例。从Small格式化的字符串到您的数据结构。

这些示例应该涵盖90%的使用场景。

use sml::{Small, FromSmall, SmallError};

#[derive(Debug)]
struct Hobbit {
    name:    String,
    age:     u32,
    friends: Vec<Hobbit>,
    bicycle: Option<String>,
}

impl FromSmall for Hobbit {
    fn from_small(s: &Small) -> Result<Self, SmallError> {
        Ok(Hobbit {
            name:    String::path(&s, "hobbit::name")?,
            age:     u32::path(&s, "hobbit::age")?,
            friends: Vec::<Hobbit>::path(&s, "hobbit::friends::hobbit")?,
            bicycle: Option::<String>::path(&s, "hobbit::bicycle")?,
        })
    }
}

fn main() {
    let s = r#"
        hobbit:
            name:         "Frodo Baggins"
            age:          "98"
            friends:
                hobbit:
                    name: "Bilbo Baggins"
                    age:  "176"
                hobbit:
                    name: "Samwise Gamgee"
                    age:  "66""#;
    
    let frodo = Hobbit::from_str_debug(s);
    println!("name: {}", frodo.name);
}

FromSmall特质

实现了FromSmall特质的类型可以从Small格式化的字符串中构建。

必需函数

from_small(slice: &Small) -> Result<Self, SmallError>

from_small()函数描述了如何从Small的部分创建数据结构。

path(small: &Small, key_path: &str) -> Result<Self, SmallError>

Small减少到key_path,然后使用FromSmall特质将转换到接收器类型。

from_str(s: &str) -> Result<Self, SmallError>

Small格式化的字符串转换为接收器的高级函数。

from_str_debug(s: &str) -> Self

Small格式化的字符串转换为接收器的高级函数,提供有用的错误消息以供调试。

实现

一个 Small 值可能是一个包含 Small 值的集合。例如,

hobbit:
    name: "Bilbo Baggins"
    age:  "176"
hobbit:
    name: "Samwise Gamgee"
    age:  "66"

包含两个元素

hobbit:
    name: "Bilbo Baggins"
    age:  "176"

hobbit:
    name: "Samwise Gamgee"
    age:  "66"

在实现 FromSmall 时,我们通常希望将一个 Small 对象转换为一个单一值,因此我们需要检查 Small 是否只有一个元素。从 Smallu32 的转换实现说明了如何做到这一点。 unique_value() 检查 Small 中是否只有一个元素,如果是,则返回该元素,而 value() 将其提取为一个 String

impl FromSmall for u32 {
    fn from_small(s: &Small) -> Result<Self, SmallError> {
        let token = s.unique_value()?;
        token
            .value()?
            .parse::<u32>()
            .map_err(|_| SmallError::ParseValue(token, "u32"))
    }
}

依赖项

~0–7.5MB
~45K SLoC