logo
macro_rules! assert_fields {
    ($t:ident::$v:ident: $($f:ident),+) => { ... };
    ($t:path: $($f:ident),+) => { ... };
}
Expand description

Asserts that the type has the given fields.

Examples

One common use case is when types have fields defined multiple times as a result of #[cfg]. This can be an issue when exposing a public API.

pub struct Ty {
    #[cfg(windows)]
    pub val1: u8,
    #[cfg(not(windows))]
    pub val1: usize,

    #[cfg(unix)]
    pub val2: u32,
    #[cfg(not(unix))]
    pub val2: usize,
}

// Always have `val2` regardless of OS
assert_fields!(Ty: val2);

This macro even works with enum variants:

enum Data {
    Val {
        id: i32,
        name: String,
        bytes: [u8; 128],
    },
    Ptr(*const u8),
}

assert_fields!(Data::Val: id, bytes);

The following example fails to compile because Range does not have a field named middle:

use std::ops::Range;

assert_fields!(Range<u32>: middle);