44个发布版本
0.1.46 | 2019年4月17日 |
---|---|
0.1.45 | 2019年4月15日 |
0.1.6 | 2019年3月31日 |
在编码分类中排名第1138
每月下载量92次
43KB
735 行
SML
SML
是一种简单标记语言,旨在将人类可读信息转换为Rust类型,具有将配置文件和模式加载为特定目的。
该格式看起来像
hobbit:
name: Frodo Baggins
age: 98
friends:
hobbit:
name: Bilbo Baggins
age: 176
hobbit:
name: Samwise Gamgee
age: 66
数据格式规则
-
缩进有意义,为4个空格,相对于顶级键。如果缩进相对于顶级键,则可以整齐地对齐代码中嵌入的字符串。
-
所有值都必须使用双引号。
-
键/值组合用于字段
name: "Frodo"
用于struct
字段和enum
变体。仅键
hobbit:
name: "Frodo"
表示完整的struct
或enum
。这样,数据清楚地指示了与Rust数据结构的映射。
-
行之间的分隔有意义。
-
键不得包含冒号
:
,但必须跟在冒号后面。 -
值中的双引号必须使用
\"
进行转义。 -
第二个双引号之后的所有内容都将被忽略。
-
空行或仅包含空白的行将被忽略。
-
注释需要在行首使用
//
,例如
// 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
是否只有一个元素。从 Small
到 u32
的转换实现说明了如何做到这一点。 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