kx_utils/
marker.rs

1//
2
3/// Defines a marker type with [Clone], [Copy], [Debug], [Display] nad [PartialEq].
4///
5/// # Example
6///
7/// ```rust
8/// use kx_utils::marker;
9/// marker!(Token, "Has no inner value");
10/// let token = Token;
11/// ```
12///
13/// This is the equivalent of:
14///
15/// ```rust
16/// #[doc = "Has no inner value"]
17/// #[derive(
18///     Clone,
19///     Copy,
20///     Debug,
21///     derive_more::Display,
22///     PartialEq,
23/// )]
24/// pub struct Token;
25/// let token = Token;
26/// ```
27#[macro_export]
28macro_rules! marker {
29    ($name:ident, $docs:literal) => {
30        #[doc = $docs]
31        #[derive(Clone, Copy, Debug, derive_more::Display, PartialEq, Eq)]
32        pub struct $name;
33    };
34}
35
36#[cfg(test)]
37mod tests {
38    // a newtype with no inner value
39    marker!(A, "a type");
40
41    #[test]
42    fn marker_is_equals() {
43        assert_eq!(A, A);
44    }
45
46    #[test]
47    fn marker_is_clone() {
48        let a1 = A;
49        #[allow(clippy::clone_on_copy)]
50        let a2 = a1.clone();
51        assert_eq!(a1, a2);
52    }
53
54    #[test]
55    fn marker_is_copy() {
56        let a1 = A;
57        let a2 = a1;
58        fn consume(_a: A) {}
59        consume(a1);
60        assert_eq!(a2, a1);
61    }
62
63    #[test]
64    fn marker_is_debug() {
65        assert_eq!(format!("{:?}", A), "A");
66    }
67
68    #[test]
69    fn marker_is_display() {
70        assert_eq!(format!("{}", A), "A");
71    }
72}