directxtex 1.3.0

Unofficial Rust bindings for Microsoft's DirectXTex library
Documentation
macro_rules! c_enum {
    (
        $(#[doc=$enumeration_doc:literal])*
        $module:ident::$enumeration:ident($underlying:ty) => {$(
            $(#[doc=$variant_doc:literal])*
            $variant:ident = $value:literal,
        )*}

        $(extra => {$(
            $(#[doc=$extra_variant_doc:literal])*
            $extra_variant:ident = $extra_value:literal,
        )*})?
    ) => {
        #[allow(non_camel_case_types)]
        #[derive(Clone, Copy, Eq, Hash, PartialEq, PartialOrd, Ord)]
        #[repr(transparent)]
        $(#[doc = $enumeration_doc])*
        pub struct $enumeration($underlying);

        impl $enumeration {
            $(
                $(#[doc = $variant_doc])*
                pub const $variant: Self = Self($value);
            )*

            $($(
                $(#[doc = $extra_variant_doc])*
                pub const $extra_variant: Self = Self($extra_value);
            )*)?

            #[must_use]
            pub const fn bits(self) -> $underlying {
                self.0
            }
        }

        impl Default for $enumeration {
            fn default() -> Self {
                Self(0)
            }
        }

        impl From<$enumeration> for $underlying {
            fn from(value: $enumeration) -> Self {
                value.0
            }
        }

        impl From<$underlying> for $enumeration {
            fn from(value: $underlying) -> Self {
                Self(value)
            }
        }

        impl core::fmt::Debug for $enumeration {
            fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
                match self.0 {
                    $($value => write!(f, "{}", core::stringify!($variant)),)*
                    $($(
                        #[allow(unreachable_patterns)]
                        $extra_value => write!(f, "{}", core::stringify!($extra_variant)),
                    )*)?
                    unk => write!(f, "0x{unk:x}"),
                }
            }
        }

        pub(crate) mod $module {
            use super::$enumeration;

            $(
                $(#[doc = $variant_doc])*
                pub const $variant: $enumeration = $enumeration($value);
            )*

            $($(
                $(#[doc = $extra_variant_doc])*
                pub const $extra_variant: $enumeration = $enumeration($extra_value);
            )*)?
        }
    };
}

pub(crate) use c_enum;

macro_rules! c_bits {
    (
        $(#[doc=$enumeration_doc:literal])*
        $module:ident::$enumeration:ident($underlying:ty) => {$(
            $(#[doc=$variant_doc:literal])*
            $variant:ident = $value:literal,
        )*}

        $(extra => {$(
            $(#[doc=$extra_variant_doc:literal])*
            $extra_variant:ident = $extra_value:expr;
        )*})?
    ) => {
        bitflags::bitflags! {
            #[allow(non_camel_case_types)]
            #[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
            #[repr(transparent)]
            $(#[doc = $enumeration_doc])*
            pub struct $enumeration: $underlying {
                $(
                    $(#[doc = $variant_doc])*
                    const $variant = $value;
                )*
                const _ = !0;
            }
        }

        impl $enumeration {
            $($(
                $(#[doc = $extra_variant_doc])*
                pub const $extra_variant: Self = $extra_value;
            )*)?

            #[allow(unused)]
            #[must_use]
            pub(crate) fn bits_fixed(self) -> u32 {
                self.bits() as u32
            }
        }

        pub(crate) mod $module {
            use super::$enumeration;

            $(
                $(#[doc = $variant_doc])*
                pub const $variant: $enumeration = unsafe { $enumeration::from_bits($value).unwrap_unchecked() };
            )*

            $($(
                $(#[doc = $extra_variant_doc])*
                pub const $extra_variant: $enumeration = $extra_value;
            )*)?
        }
    };
}

pub(crate) use c_bits;