1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! YAML Merge Keys //! //! The YAML Merge Key extension is not supported by the core YAML crate, but can be implemented //! after parsing. This crate transforms a parsed YAML document and merges dictionaries together. //! //! # Usage //! //! This crate provides a function which implements the [YAML Merge Key extension]. Given a YAML //! document from `yaml-rust` (or `serde_yaml` with the `serde_yaml` feature), it will return //! a YAML document with the merge keys removed and merged into their owning dictionaries. //! //! ```rust //! # extern crate yaml_rust; //! # extern crate yaml_merge_keys; //! # #[cfg(feature = "serde_yaml")] //! # extern crate serde_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); //! } //! ``` //! //! [YAML Merge Key extension]: http://yaml.org/type/merge.html //! //! # Example //! //! ```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 //! ``` #![deny(missing_docs)] #[macro_use] extern crate lazy_static; mod crates { // public #[cfg(feature = "serde_yaml")] pub extern crate serde_yaml; pub extern crate yaml_rust; // private pub extern crate thiserror; } mod merge_keys; #[cfg(feature = "serde_yaml")] mod serde; pub use merge_keys::merge_keys; pub use merge_keys::MergeKeyError; #[cfg(feature = "serde_yaml")] pub use serde::merge_keys_serde; #[cfg(test)] mod test; #[cfg(all(test, feature = "serde_yaml"))] mod test_serde;