commit | 49641849dfe484aa774b75cc004c7f1899cd305a | [log] [tgz] |
---|---|---|
author | Android Build Coastguard Worker <[email protected]> | Fri Mar 10 04:19:18 2023 +0000 |
committer | Automerger Merge Worker <[email protected]> | Fri Mar 10 04:19:18 2023 +0000 |
tree | 6c7619c9d5f5ac4db66bdfd6285662cca6a59a40 | |
parent | 30ad00d11d631c017abd43cbdc6cf32d42f3fb15 [diff] | |
parent | 7b5ef8d91699536ee1e51a6727778c7309720c2d [diff] |
Snap for 9719949 from 4aa28dc4a0a59b0b70ba9306841de43932d89dd4 to udc-release am: 7b5ef8d916 Original change: https://googleplex-android-review.googlesource.com/c/platform/external/rust/crates/merge/+/21946666 Change-Id: If81ef27b8e1cd68d4c115056edd4e6f975163cfd Signed-off-by: Automerger Merge Worker <[email protected]>
The merge
crate provides the Merge
trait that can be used to merge multiple values into one:
trait Merge { fn merge(&mut self, other: Self); }
Merge
is implemented for Option
and can be derived for structs:
use merge::Merge; #[derive(Merge)] struct User { // Fields with the skip attribute are skipped by Merge #[merge(skip)] pub name: &'static str, // The Merge implementation for Option replaces its value if it is None pub location: Option<&'static str>, // The strategy attribute is used to customize the merge behavior #[merge(strategy = merge::vec::append)] pub groups: Vec<&'static str>, } let defaults = User { name: "", location: Some("Internet"), groups: vec!["rust"], }; let mut ferris = User { name: "Ferris", location: None, groups: vec!["mascot"], }; ferris.merge(defaults); assert_eq!("Ferris", ferris.name); assert_eq!(Some("Internet"), ferris.location); assert_eq!(vec!["mascot", "rust"], ferris.groups);
A merge strategy is a function with the signature fn merge<T>(left: &mut T, right: T)
that merges right
into left
. The merge
crate provides strategies for the most common types, but you can also define your own strategies.
The trait can be used to merge configuration from different sources, for example environment variables, multiple configuration files and command-line arguments, see the args.rs
example.
This crate has the following features:
derive
(default): Enables the derive macro for the Merge
trait using the merge_derive
crate.num
(default): Enables the merge strategies in the num
module that require the num_traits
crate.std
(default): Enables the merge strategies in the vec
module that require the standard library. If this feature is not set, merge
is a no_std
library.This crate supports Rust 1.36.0 or later.
For bug reports, patches, feature requests and other messages, please send a mail to ~ireas/[email protected] using the [merge-rs]
prefix in the subject.
This project is dual-licensed under the Apache-2.0 and MIT licenses. The documentation and configuration files contained in this repository are licensed under the Creative Commons Zero license. You can find a copy of the license texts in the LICENSES
directory.
merge-rs
complies with version 3.0 of the REUSE specification.