kx_utils/experimental/
marker.rs

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
//

/// Defines a marker type with [Clone], [Copy], [Debug], [Display] nad [PartialEq].
///
/// # Example
///
/// ```rust
/// use kx_utils::marker;
/// marker!(Token, "Has no inner value");
/// let token = Token;
/// ```
///
/// This is the equivalent of:
///
/// ```rust
/// #[doc = "Has no inner value"]
/// #[derive(
///     Clone,
///     Copy,
///     Debug,
///     derive_more::Display,
///     PartialEq,
/// )]
/// pub struct Token;
/// let token = Token;
/// ```
#[macro_export]
macro_rules! marker {
    ($name:ident, $docs:literal) => {
        #[doc = $docs]
        #[derive(Clone, Copy, Debug, derive_more::Display, PartialEq)]
        pub struct $name;
    };
}

#[cfg(test)]
mod tests {
    // a newtype with no inner value
    marker!(A, "a type");

    #[test]
    fn marker_is_equals() {
        assert_eq!(A, A);
    }

    #[test]
    fn marker_is_clone() {
        let a1 = A;
        #[allow(clippy::clone_on_copy)]
        let a2 = a1.clone();
        assert_eq!(a1, a2);
    }

    #[test]
    fn marker_is_copy() {
        let a1 = A;
        let a2 = a1;
        fn consume(_a: A) {}
        consume(a1);
        assert_eq!(a2, a1);
    }

    #[test]
    fn marker_is_debug() {
        assert_eq!(format!("{:?}", A), "A");
    }

    #[test]
    fn marker_is_display() {
        assert_eq!(format!("{}", A), "A");
    }
}