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");
}
}