Bug: 261877268

Clone this repo:
  1. 23655b5 Migrate to cargo_embargo. by Andrew Walbran · 6 weeks ago main master
  2. b11dfab Move OWNER reference master=>main. am: 98699979bb by Sam Saccone · 5 months ago
  3. 9869997 Move OWNER reference master=>main. by Sam Saccone · 5 months ago
  4. 4aa28dc Make merge available to product and vendor am: 967d5c94d3 am: f35d63433a am: 9c6053f4da by Matthew Maurer · 9 months ago android14-dev
  5. 9c6053f Make merge available to product and vendor am: 967d5c94d3 am: f35d63433a by Matthew Maurer · 9 months ago


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;

struct User {
    // Fields with the skip attribute are skipped by Merge
    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"],

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.

Minimum Supported Rust Version

This crate supports Rust 1.36.0 or later.


For bug reports, patches, feature requests and other messages, please send a mail to ~ireas/public-inbox@lists.sr.ht 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.