Collect errors into a single error
This commit is contained in:
		
							parent
							
								
									2b7d5560ad
								
							
						
					
					
						commit
						c8c5c8ff16
					
				| @ -1,4 +1,4 @@ | ||||
| use crate::FixedSizedError; | ||||
| use crate::Error; | ||||
| use bit_reverse::LookupReverse; | ||||
| use bit_vec::BitVec as Bitfield; | ||||
| use serde::de::{Deserialize, Deserializer}; | ||||
| @ -12,10 +12,10 @@ use typenum::Unsigned; | ||||
| 
 | ||||
| /// Provides a common `impl` for structs that wrap a `$name`.
 | ||||
| macro_rules! common_impl { | ||||
|     ($name: ident, $error: ident) => { | ||||
|     ($name: ident) => { | ||||
|         impl<N: Unsigned> $name<N> { | ||||
|             /// Create a new BitList list with `initial_len` bits all set to `false`.
 | ||||
|             pub fn with_capacity(initial_len: usize) -> Result<Self, $error> { | ||||
|             pub fn with_capacity(initial_len: usize) -> Result<Self, Error> { | ||||
|                 Self::from_elem(initial_len, false) | ||||
|             } | ||||
| 
 | ||||
| @ -23,7 +23,7 @@ macro_rules! common_impl { | ||||
|             ///
 | ||||
|             /// Note: if `initial_len` is not a multiple of 8, the remaining bits will be set to `false`
 | ||||
|             /// regardless of `bit`.
 | ||||
|             pub fn from_elem(initial_len: usize, bit: bool) -> Result<Self, $error> { | ||||
|             pub fn from_elem(initial_len: usize, bit: bool) -> Result<Self, Error> { | ||||
|                 // BitVec can panic if we don't set the len to be a multiple of 8.
 | ||||
|                 let full_len = ((initial_len + 7) / 8) * 8; | ||||
| 
 | ||||
| @ -44,7 +44,7 @@ macro_rules! common_impl { | ||||
|             } | ||||
| 
 | ||||
|             /// Create a new bitfield using the supplied `bytes` as input
 | ||||
|             pub fn from_bytes(bytes: &[u8]) -> Result<Self, $error> { | ||||
|             pub fn from_bytes(bytes: &[u8]) -> Result<Self, Error> { | ||||
|                 Self::validate_length(bytes.len().saturating_mul(8))?; | ||||
| 
 | ||||
|                 Ok(Self { | ||||
| @ -62,17 +62,17 @@ macro_rules! common_impl { | ||||
|             /// If the index is in bounds, then result is Ok(value) where value is `true` if the
 | ||||
|             /// bit is 1 and `false` if the bit is 0.  If the index is out of bounds, we return an
 | ||||
|             /// error to that extent.
 | ||||
|             pub fn get(&self, i: usize) -> Result<bool, $error> { | ||||
|             pub fn get(&self, i: usize) -> Result<bool, Error> { | ||||
|                 if i < N::to_usize() { | ||||
|                     match self.bitfield.get(i) { | ||||
|                         Some(value) => Ok(value), | ||||
|                         None => Err($error::OutOfBounds { | ||||
|                         None => Err(Error::OutOfBounds { | ||||
|                             i, | ||||
|                             len: self.bitfield.len(), | ||||
|                         }), | ||||
|                     } | ||||
|                 } else { | ||||
|                     Err($error::InvalidLength { | ||||
|                     Err(Error::InvalidLength { | ||||
|                         i, | ||||
|                         len: N::to_usize(), | ||||
|                     }) | ||||
| @ -83,10 +83,10 @@ macro_rules! common_impl { | ||||
|             ///
 | ||||
|             /// If the index is out of bounds, we expand the size of the underlying set to include
 | ||||
|             /// the new index.  Returns the previous value if there was one.
 | ||||
|             pub fn set(&mut self, i: usize, value: bool) -> Result<(), $error> { | ||||
|             pub fn set(&mut self, i: usize, value: bool) -> Result<(), Error> { | ||||
|                 match self.get(i) { | ||||
|                     Ok(previous) => Some(previous), | ||||
|                     Err($error::OutOfBounds { len, .. }) => { | ||||
|                     Err(Error::OutOfBounds { len, .. }) => { | ||||
|                         let new_len = i - len + 1; | ||||
|                         self.bitfield.grow(new_len, false); | ||||
|                         None | ||||
| @ -266,7 +266,7 @@ pub struct BitVector<N> { | ||||
|     _phantom: PhantomData<N>, | ||||
| } | ||||
| 
 | ||||
| common_impl!(BitVector, FixedSizedError); | ||||
| common_impl!(BitVector); | ||||
| 
 | ||||
| impl<N: Unsigned> BitVector<N> { | ||||
|     /// Create a new bitfield.
 | ||||
| @ -278,11 +278,11 @@ impl<N: Unsigned> BitVector<N> { | ||||
|         N::to_usize() | ||||
|     } | ||||
| 
 | ||||
|     fn validate_length(len: usize) -> Result<(), FixedSizedError> { | ||||
|     fn validate_length(len: usize) -> Result<(), Error> { | ||||
|         let fixed_len = N::to_usize(); | ||||
| 
 | ||||
|         if len > fixed_len { | ||||
|             Err(FixedSizedError::InvalidLength { | ||||
|             Err(Error::InvalidLength { | ||||
|                 i: len, | ||||
|                 len: fixed_len, | ||||
|             }) | ||||
| @ -329,7 +329,7 @@ pub struct BitList<N> { | ||||
|     _phantom: PhantomData<N>, | ||||
| } | ||||
| 
 | ||||
| common_impl!(BitList, FixedSizedError); | ||||
| common_impl!(BitList); | ||||
| 
 | ||||
| impl<N: Unsigned> BitList<N> { | ||||
|     /// Create a new, empty BitList.
 | ||||
| @ -340,11 +340,11 @@ impl<N: Unsigned> BitList<N> { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn validate_length(len: usize) -> Result<(), FixedSizedError> { | ||||
|     fn validate_length(len: usize) -> Result<(), Error> { | ||||
|         let max_len = Self::max_len(); | ||||
| 
 | ||||
|         if len > max_len { | ||||
|             Err(FixedSizedError::InvalidLength { | ||||
|             Err(Error::InvalidLength { | ||||
|                 i: len, | ||||
|                 len: max_len, | ||||
|             }) | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use crate::FixedSizedError as Error; | ||||
| use crate::Error; | ||||
| use serde_derive::{Deserialize, Serialize}; | ||||
| use std::marker::PhantomData; | ||||
| use std::ops::{Deref, Index, IndexMut}; | ||||
|  | ||||
| @ -7,30 +7,9 @@ pub use fixed_vector::FixedVector; | ||||
| pub use typenum; | ||||
| pub use variable_list::VariableList; | ||||
| 
 | ||||
| /// Returned when a variable-length item encounters an error.
 | ||||
| /// Returned when an item encounters an error.
 | ||||
| #[derive(PartialEq, Debug)] | ||||
| pub enum VariableSizedError { | ||||
|     /// The operation would cause the maximum length to be exceeded.
 | ||||
|     ExceedsMaxLength { | ||||
|         len: usize, | ||||
|         max_len: usize, | ||||
|     }, | ||||
|     OutOfBounds { | ||||
|         i: usize, | ||||
|         len: usize, | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| /// Returned when a fixed-length item encounters an error.
 | ||||
| #[derive(PartialEq, Debug)] | ||||
| pub enum FixedSizedError { | ||||
|     /// The operation would create an item of an invalid size.
 | ||||
|     InvalidLength { | ||||
|         i: usize, | ||||
|         len: usize, | ||||
|     }, | ||||
|     OutOfBounds { | ||||
|         i: usize, | ||||
|         len: usize, | ||||
|     }, | ||||
| pub enum Error { | ||||
|     InvalidLength { i: usize, len: usize }, | ||||
|     OutOfBounds { i: usize, len: usize }, | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use crate::VariableSizedError as Error; | ||||
| use crate::Error; | ||||
| use serde_derive::{Deserialize, Serialize}; | ||||
| use std::marker::PhantomData; | ||||
| use std::ops::{Deref, Index, IndexMut}; | ||||
| @ -61,9 +61,9 @@ impl<T, N: Unsigned> VariableList<T, N> { | ||||
|                 _phantom: PhantomData, | ||||
|             }) | ||||
|         } else { | ||||
|             Err(Error::ExceedsMaxLength { | ||||
|                 len: vec.len(), | ||||
|                 max_len: Self::max_len(), | ||||
|             Err(Error::InvalidLength { | ||||
|                 i: vec.len(), | ||||
|                 len: Self::max_len(), | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
| @ -90,9 +90,9 @@ impl<T, N: Unsigned> VariableList<T, N> { | ||||
|         if self.vec.len() < Self::max_len() { | ||||
|             Ok(self.vec.push(value)) | ||||
|         } else { | ||||
|             Err(Error::ExceedsMaxLength { | ||||
|                 len: self.vec.len() + 1, | ||||
|                 max_len: Self::max_len(), | ||||
|             Err(Error::InvalidLength { | ||||
|                 i: self.vec.len() + 1, | ||||
|                 len: Self::max_len(), | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user