module/types/
first.rs

1//! A no-op merge that retains the first value.
2//!
3//! See: [`First`].
4
5use super::prelude::*;
6
7merge_thin_wrapper! {
8    /// A no-op merge that retains the first value.
9    ///
10    /// This type provides a merge implementation that _does nothing_. Merging
11    /// anything with a value of this type results in the other value getting
12    /// discarded.
13    ///
14    /// The opposite of this is [`Last`].
15    ///
16    /// # Example
17    ///
18    /// ```rust
19    /// # use module::types::First;
20    /// # use module::merge::Merge;
21    /// let a = First(vec![0, 1, 2]);
22    /// let b = First(vec![3, 4]);
23    ///
24    /// let merged = a.merge(b).unwrap();
25    ///
26    /// assert_eq!(*merged, &[0, 1, 2]);
27    /// ```
28    ///
29    /// # serde
30    ///
31    /// This type deserializes like `T`.
32    ///
33    /// [`Last`]: crate::types::Last
34    #[cfg_attr(feature = "serde", derive(serde::Deserialize))]
35    pub struct First;
36}
37
38impl<T> Merge for First<T> {
39    #[inline]
40    fn merge_ref(&mut self, _: Self) -> Result<(), Error> {
41        Ok(())
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_merge_ab() {
51        let a = First(42);
52        let b = First(43);
53
54        let merged = a.merge(b).unwrap();
55        assert_eq!(*merged, 42);
56    }
57
58    #[test]
59    fn test_merge_ba() {
60        let a = First(42);
61        let b = First(43);
62
63        let merged = b.merge(a).unwrap();
64        assert_eq!(*merged, 43);
65    }
66}
67
68#[cfg(test)]
69#[cfg(feature = "serde")]
70mod serde_tests {
71    use super::*;
72
73    #[test]
74    fn test_deserialize() {
75        let x: First<i32> = serde_json::from_str("42").unwrap();
76        assert_eq!(*x, 42);
77    }
78}