Skip to content

Commit e3cf71f

Browse files
committed
move try_from_bits and FromBitsError to fallible module
1 parent 9eb16f3 commit e3cf71f

File tree

2 files changed

+34
-37
lines changed

2 files changed

+34
-37
lines changed

enumflags/src/fallible.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use core::convert::TryFrom;
2-
use super::{BitFlags, FromBitsError};
2+
use super::BitFlags;
33
use super::_internal::RawBitFlags;
44

55
macro_rules! impl_try_from {
@@ -16,7 +16,15 @@ macro_rules! impl_try_from {
1616
type Error = FromBitsError<T>;
1717

1818
fn try_from(bits: T::Type) -> Result<Self, Self::Error> {
19-
Self::try_from_bits(bits)
19+
let flags = Self::from_bits_truncate(bits);
20+
if flags.bits() == bits {
21+
Ok(flags)
22+
} else {
23+
Err(FromBitsError {
24+
flags,
25+
invalid: bits & !flags.bits(),
26+
})
27+
}
2028
}
2129
}
2230
};
@@ -25,3 +33,26 @@ macro_rules! impl_try_from {
2533
impl_try_from! {
2634
u8, u16, u32, u64, usize
2735
}
36+
37+
#[derive(Debug, Copy, Clone)]
38+
pub struct FromBitsError<T: RawBitFlags> {
39+
flags: BitFlags<T>,
40+
invalid: T::Type,
41+
}
42+
43+
impl<T: RawBitFlags> FromBitsError<T> {
44+
pub fn truncate(self) -> BitFlags<T> {
45+
self.flags
46+
}
47+
48+
pub fn invalid_bits(self) -> T::Type {
49+
self.invalid
50+
}
51+
}
52+
53+
#[cfg(feature = "std")]
54+
impl<T: RawBitFlags> std::error::Error for FromBitsError<T> {
55+
fn description(&self) -> &str {
56+
"invalid bit representation"
57+
}
58+
}

enumflags/src/lib.rs

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ mod formatting;
122122

123123
// impl TryFrom<T::Type> for BitFlags<T>
124124
mod fallible;
125+
pub use fallible::FromBitsError;
125126

126127
use _internal::RawBitFlags;
127128

@@ -212,18 +213,6 @@ where
212213
BitFlags { val: t.bits() }
213214
}
214215

215-
pub fn try_from_bits(bits: T::Type) -> Result<Self, FromBitsError<T>> {
216-
let flags = Self::from_bits_truncate(bits);
217-
if flags.bits() == bits {
218-
Ok(flags)
219-
} else {
220-
Err(FromBitsError {
221-
flags,
222-
invalid: bits & !flags.bits(),
223-
})
224-
}
225-
}
226-
227216
/// Truncates flags that are illegal
228217
pub fn from_bits_truncate(bits: T::Type) -> Self {
229218
unsafe { BitFlags::new(bits & T::all()) }
@@ -381,26 +370,3 @@ mod impl_serde {
381370
}
382371
}
383372
}
384-
385-
#[derive(Debug, Copy, Clone)]
386-
pub struct FromBitsError<T: RawBitFlags> {
387-
flags: BitFlags<T>,
388-
invalid: T::Type,
389-
}
390-
391-
impl<T: RawBitFlags> FromBitsError<T> {
392-
pub fn truncate(self) -> BitFlags<T> {
393-
self.flags
394-
}
395-
396-
pub fn invalid_bits(self) -> T::Type {
397-
self.invalid
398-
}
399-
}
400-
401-
#[cfg(feature = "std")]
402-
impl<T: RawBitFlags> std::error::Error for FromBitsError<T> {
403-
fn description(&self) -> &str {
404-
"invalid bit representation"
405-
}
406-
}

0 commit comments

Comments
 (0)