#yaml #yaml-parser #merge #key #serde-yaml #mapping #key-value

yaml-merge-keys

实现了YAML合并键扩展。http://yaml.org/type/merge.html

10个版本 (6个破坏性版本)

0.7.0 2024年3月26日
0.6.0 2023年5月30日
0.5.1 2021年12月6日
0.5.0 2021年11月22日
0.1.0 2017年3月30日

#151 in 编码

Download history 17412/week @ 2024-04-23 10329/week @ 2024-04-30 7279/week @ 2024-05-07 6791/week @ 2024-05-14 8776/week @ 2024-05-21 7050/week @ 2024-05-28 7983/week @ 2024-06-04 6998/week @ 2024-06-11 6581/week @ 2024-06-18 7596/week @ 2024-06-25 6136/week @ 2024-07-02 7315/week @ 2024-07-09 8153/week @ 2024-07-16 8662/week @ 2024-07-23 9838/week @ 2024-07-30 7320/week @ 2024-08-06

每月下载量 35,358
11 个crate中使用 (直接使用9个)

MIT/Apache

43KB
969 代码行

Yaml合并键

本crate实现了对来自 yaml-rustserde_yaml (具有 serde_yaml 功能) 的crate的YAML文档的 Merge Key Language-Independent Type for YAML 草案规范的实现。

当一个YAML文档中的映射包含一个 << 键时,它的值应该是映射或映射的序列。对于每个映射,它将合并到父映射中,父映射在冲突中获胜(因此它可以覆盖合并集中的键)。


lib.rs:

YAML合并键

YAML合并键扩展不受核心YAML crate支持,但可以在解析后实现。本crate转换解析后的YAML文档,并将字典合并在一起。

用法

本crate提供了一个实现 YAML合并键扩展 的函数。给定一个来自 yaml-rust (或具有 serde_yaml 功能的 serde_yaml) 的YAML文档,它将返回一个没有合并键并且合并到拥有字典中的YAML文档。

use yaml_rust::YamlLoader;
use yaml_merge_keys::merge_keys;

// YAML document contents.
let raw = "\
ref: &ref
    merged_key: merged
    added_key: merged
dict:
    <<: *ref
    top_key: given
    merged_key: given
";
let merged = "\
ref:
    merged_key: merged
    added_key: merged
dict:
    top_key: given
    merged_key: given
    added_key: merged
";

// Parse the YAML documents.
let raw_yaml = YamlLoader::load_from_str(raw).unwrap().remove(0);
let merged_yaml = YamlLoader::load_from_str(merged).unwrap().remove(0);

// Merge the keys.
let merged_keys = merge_keys(raw_yaml).unwrap();

// The keys have been merged.
assert_eq!(merged_keys, merged_yaml);

// Using `serde_yaml` is also supported with the feature.
#[cfg(feature = "serde_yaml")]
{
    use yaml_merge_keys::merge_keys_serde;

    let raw_yaml = serde_yaml::from_str(raw).unwrap();
    let merged_yaml: serde_yaml::Value = serde_yaml::from_str(merged).unwrap();

    let merged_keys = merge_keys_serde(raw_yaml).unwrap();

    assert_eq!(merged_keys, merged_yaml);
}

示例

---
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }

# All the following maps are equal:

- # Explicit keys
  x: 1
  y: 2
  r: 10
  label: center/big

- # Merge one map
  << : *CENTER
  r: 10
  label: center/big

- # Merge multiple maps
  << : [ *CENTER, *BIG ]
  label: center/big

- # Override
  << : [ *BIG, *LEFT, *SMALL ]
  x: 1
  label: center/big

依赖项

~2–3MB
~55K SLoC