diff options
Diffstat (limited to 'vendor/bitflags/src/external')
-rw-r--r-- | vendor/bitflags/src/external/arbitrary_support.rs | 19 | ||||
-rw-r--r-- | vendor/bitflags/src/external/bytemuck_support.rs | 19 | ||||
-rw-r--r-- | vendor/bitflags/src/external/serde_support.rs | 84 |
3 files changed, 122 insertions, 0 deletions
diff --git a/vendor/bitflags/src/external/arbitrary_support.rs b/vendor/bitflags/src/external/arbitrary_support.rs new file mode 100644 index 000000000..56708f017 --- /dev/null +++ b/vendor/bitflags/src/external/arbitrary_support.rs @@ -0,0 +1,19 @@ +#[cfg(test)] +mod tests { + use arbitrary::Arbitrary; + + bitflags! { + #[derive(Arbitrary)] + struct Color: u32 { + const RED = 0x1; + const GREEN = 0x2; + const BLUE = 0x4; + } + } + + #[test] + fn test_arbitrary() { + let mut unstructured = arbitrary::Unstructured::new(&[0_u8; 256]); + let _color = Color::arbitrary(&mut unstructured); + } +} diff --git a/vendor/bitflags/src/external/bytemuck_support.rs b/vendor/bitflags/src/external/bytemuck_support.rs new file mode 100644 index 000000000..5ab109e0d --- /dev/null +++ b/vendor/bitflags/src/external/bytemuck_support.rs @@ -0,0 +1,19 @@ +#[cfg(test)] +mod tests { + use bytemuck::{Pod, Zeroable}; + + bitflags! { + #[derive(Pod, Zeroable, Clone, Copy)] + #[repr(transparent)] + struct Color: u32 { + const RED = 0x1; + const GREEN = 0x2; + const BLUE = 0x4; + } + } + + #[test] + fn test_bytemuck() { + assert_eq!(0x1, bytemuck::cast::<Color, u32>(Color::RED)); + } +} diff --git a/vendor/bitflags/src/external/serde_support.rs b/vendor/bitflags/src/external/serde_support.rs new file mode 100644 index 000000000..7c202a296 --- /dev/null +++ b/vendor/bitflags/src/external/serde_support.rs @@ -0,0 +1,84 @@ +use core::{fmt, str}; +use serde::{ + de::{Error, Visitor}, + Deserialize, Deserializer, Serialize, Serializer, +}; + +pub fn serialize_bits_default<T: fmt::Display + AsRef<B>, B: Serialize, S: Serializer>( + flags: &T, + serializer: S, +) -> Result<S::Ok, S::Error> { + // Serialize human-readable flags as a string like `"A | B"` + if serializer.is_human_readable() { + serializer.collect_str(flags) + } + // Serialize non-human-readable flags directly as the underlying bits + else { + flags.as_ref().serialize(serializer) + } +} + +pub fn deserialize_bits_default< + 'de, + T: str::FromStr + From<B>, + B: Deserialize<'de>, + D: Deserializer<'de>, +>( + deserializer: D, +) -> Result<T, D::Error> +where + <T as str::FromStr>::Err: fmt::Display, +{ + if deserializer.is_human_readable() { + // Deserialize human-readable flags by parsing them from strings like `"A | B"` + struct FlagsVisitor<T>(core::marker::PhantomData<T>); + + impl<'de, T: str::FromStr> Visitor<'de> for FlagsVisitor<T> + where + <T as str::FromStr>::Err: fmt::Display, + { + type Value = T; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a string value of `|` separated flags") + } + + fn visit_str<E: Error>(self, flags: &str) -> Result<Self::Value, E> { + flags.parse().map_err(|e| E::custom(e)) + } + } + + deserializer.deserialize_str(FlagsVisitor(Default::default())) + } else { + // Deserialize non-human-readable flags directly from the underlying bits + let bits = B::deserialize(deserializer)?; + + Ok(bits.into()) + } +} + +#[cfg(test)] +mod tests { + use serde_test::{assert_tokens, Configure, Token::*}; + bitflags! { + #[derive(serde_derive::Serialize, serde_derive::Deserialize, Debug, PartialEq, Eq)] + #[serde(transparent)] + struct SerdeFlags: u32 { + const A = 1; + const B = 2; + const C = 4; + const D = 8; + } + } + + #[test] + fn test_serde_bitflags_default() { + assert_tokens(&SerdeFlags::empty().readable(), &[Str("")]); + + assert_tokens(&SerdeFlags::empty().compact(), &[U32(0)]); + + assert_tokens(&(SerdeFlags::A | SerdeFlags::B).readable(), &[Str("A | B")]); + + assert_tokens(&(SerdeFlags::A | SerdeFlags::B).compact(), &[U32(1 | 2)]); + } +} |