#toml-parser #toml #nom #parser #encode #decode

bin+lib tomllib

保留格式的 TOML 文件解析器和操作器

3 个版本

使用旧的 Rust 2015

0.1.2 2016 年 5 月 23 日
0.1.1 2016 年 3 月 30 日
0.1.0 2016 年 3 月 30 日

#2284解析实现


被用于 cargo-incver

MITLGPL-3.0+

760KB
5.5K SLoC

包含 (Mach-o exe, 2.5MB) tomlkit

tomllib logo tomlkit logo

tomlkit 即将到来!这是使用版本 0.1.0 可以做的事情的尝鲜

获取 Cargo.toml 文件的包名、版本、是否有许可证以及所有依赖项

find . -name 'Cargo.toml' | ./toml_parser/target/debug/tomlkit -g package.name,package.version --has-value package.license -c dependencies
"methodtest", "0.1.0", false, [nom]
"mtailtest", "0.1.0", false, [mtaillib]
"multitail", "0.1.0", false, [term, notify, getopts]
"mtaillib", "0.1.0", false, [notify, libc]
"nomplusplus", "0.1.0", true, [radix_trie, regex, lazy_static]
"rproxy", "0.1.0", false, [radix_trie]
"radix_trie", "0.0.8", true, [nibble_vec]
"rustfmt", "0.2.1", true, [toml, rustc-serialize, unicode-segmentation, regex, term, strings, diff, syntex_syntax, log, env_logger, getopts]
"test", "0.1.0", false, []
"tomllib", "0.1.2", true, [nom, regex, log, env_logger, pirate, csv]
"tomllib", "0.1.0", true, [nom, regex, log, env_logger]
"tomllib", "0.1.1", true, [nom, regex, log, env_logger]
"trietest", "0.1.0", false, [radix_trie]

tomllib(0.1.1)的第一个版本已发布!在 crates.io 上获取它!

我写了一篇关于我在 nom 中创建方法宏的冒险的博客文章。阅读它

tomllib 是 TOML 文件的解析器、修改器和生成器 它不会评判你

######它使用 nom 编写。 tomlkit 是具有与 tomllib 相同功能的命令行工具,在 tomllib 发布后不久将推出。

Crates.io Build Status Coverage Status ghit.me

####它为什么不评判我?###

tomllib 尊重你的疯狂缩进和空白方案。它尊重你放置事物的顺序。它不会试图根据 别人的 对文件格式纯度的看法重新格式化文件。它只会执行你告诉它执行的改变,并将其他部分保持不变。想要在每对键和 = 之间有 20 个制表符?请随意!想要在数组的每个值之后放置注释和 5 个新行?我们不会试图改变你的想法!随机放置的表格和嵌套表格?这是你的文件!你想做什么就做什么,只要它在规范范围内;我们不会试图改变它。

参考文档可以在 这里 找到。

###tomllib###

基于 我的版本 的官方 TOML ABNF(至少直到他们合并我的更改)。目前可以解析整个 Unicode TOML 文件,并将它们重构为完美的副本,保留顺序和所有空白。在 toml README 示例、正规、硬和 Unicode 硬示例以及 toml 测试目录 中的所有有效和无效测试以及 BurntSushi/toml-test 中的所有有效和无效测试上进行了测试,除了 一个实际上是有效的无效测试

示例

以下是解析 TOML 文档并获取和设置值的步骤(请注意,由于 parse 方法的实现方式,它将获取解析器的所有权,然后以元组形式返回,其中包含 ParseResult

use tomllib::TOMLParser;
use tomllib::types::Value;

let parser = TOMLParser::new();
let toml_doc = r#"
[table] # This is a comment
 "A Key" = "A Value" # This line is indented
  SomeKey = "Some Value" # This line is indented twice
"#;
let (mut parser, result) = parser.parse(toml_doc);
parser.get_value("table.SomeKey"); // gets "Some Value"
parser.set_value("table.\"A Key\"", Value::float(9.876));
parser.set_value("table.SomeKey", Value::bool(false));

表格和内联表格具有子键,而表格数组和数组使用从 0 开始的数组索引,例如

an_array = ["A", "B", "C"]
inline_table = {first = 1.1, second = 1.3}
[[array_of_table]]
[[array_of_table]]
foo = "D"
[table]
bar = "F"
[[fruit]]
  [fruit.type]
nested = {third = [{fourth = "okay"}, {fifth = "something", sixth = "baz"}]

在上面的例子中,“C” 的键是 an_array[2],1.3 的键是 inline_table.second,“D” 的键是 array_of_table[1].foo,而 “F” 的键是 table.bar。您可以嵌套内联表和数组,例如,“baz” 的键是 fruit[0].type.nested.third[1].sixth

以下是一个快速示例,展示了如何使用返回的 ParseResult 处理任何 ParseError

use tomllib::TOMLParser;
use tomllib::types::{Value, ParseResult, ParseError};

let parser = TOMLParser::new();
let toml_doc = r#"
[[array_of_tables]]
 [array_of_tables.has_error]
 mixed_array = [5, true]
"#;
let (mut parser, result) = parser.parse(toml_doc);
// For brevity's sake we're only matching `FullError` `ParseResult`s and `MixedArray` `ParseError`s
match result {
  ParseResult::FullError(rrc_errors) => {
    println!("Parsed the full document, but with errors:");
    for error in rrc_errors.borrow().iter() {
      match error {
        &ParseError::MixedArray(ref key, ref line, ref column) => {
          println!("A mixed array with key {} was encountered on line {}, column {}.", key, line, column);
          assert_eq!("array_of_tables[0].has_error.mixed_array", *key);
          assert_eq!(4, *line);
          assert_eq!(0, *column); // column reporting is unimplemented so it will always be zero        
        },
        _ => assert!(false),
      }
    }
  },
  _ => assert!(false),
}

在这个第一个版本中,您可以解析任何 TOML 文档,查找任何值,获取任何键的子键,并将任何值更改为任何其他类型的值。在整个过程中,它将保留原始格式和注释,除了对数组或内联表结构的更改。需要注意的是,如果您更改数组或内联表中的元素数量,则格式将不会保留。如果您保持数组或内联表中的元素数量不变,但更改了一些或所有值,则所有格式都将保留。

以下是一些您目前无法做到,但计划在下一个版本中实现的功能

  • 键/值插入
  • 键/值删除
  • 表格和表格数组插入
  • 表格和表格数组删除
  • 键修改
  • 表格和表格数组修改
  • 更多错误报告

对于未来的版本,以下是我计划添加的功能

  • 删除多余空格、换行符和注释的方法
  • 用户定义的空白方案
  • 元素重新排序
  • 转换为 JSON 和 YAML

入门指南

要获取源代码,请简单地 git clone https://github.com/joelself/toml_parser.git。我使用了 regex_macros 依赖项,这要求您使用 Rust 的测试版本。幸运的是,multirust 使这变得非常简单,而不会强制您的所有 Rust 环境都处于测试版本。

首先安装 multirust(您将需要 卸载当前安装的 Rust 版本

curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh

切换到 toml_parser 目录并设置该目录(以及该目录)使用 Beta Rust

cd toml_parser
multirust override beta

您可以使用 multirust override (beta|stable) 总是回到稳定版或测试版。要修改,请先叉开仓库,然后克隆它,进行修改,并发出拉取请求。如果您有任何问题,请在问题跟踪器中创建一个问题。

我很乐意听到您的反馈。如果您想让这个项目完成某项工作,请随时就此事创建一个问题。如果您不习惯在公共场合撰写问题,您可以发送电子邮件到 [email protected]

依赖关系

~6MB
~105K SLoC