39 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use num_traits::FromPrimitive;
 | |
| 
 | |
| /// Allows customer errors to be decoded back to their original enum
 | |
| pub trait DecodeError<E> {
 | |
|     fn decode_custom_error_to_enum(custom: u32) -> Option<E>
 | |
|     where
 | |
|         E: FromPrimitive,
 | |
|     {
 | |
|         E::from_u32(custom)
 | |
|     }
 | |
|     fn type_of() -> &'static str;
 | |
| }
 | |
| 
 | |
| #[cfg(test)]
 | |
| mod tests {
 | |
|     use super::*;
 | |
|     use num_derive::FromPrimitive;
 | |
| 
 | |
|     #[test]
 | |
|     fn test_decode_custom_error_to_enum() {
 | |
|         #[derive(Debug, FromPrimitive, PartialEq)]
 | |
|         enum TestEnum {
 | |
|             A,
 | |
|             B,
 | |
|             C,
 | |
|         }
 | |
|         impl<T> DecodeError<T> for TestEnum {
 | |
|             fn type_of() -> &'static str {
 | |
|                 "TestEnum"
 | |
|             }
 | |
|         }
 | |
|         assert_eq!(TestEnum::decode_custom_error_to_enum(0), Some(TestEnum::A));
 | |
|         assert_eq!(TestEnum::decode_custom_error_to_enum(1), Some(TestEnum::B));
 | |
|         assert_eq!(TestEnum::decode_custom_error_to_enum(2), Some(TestEnum::C));
 | |
|         let option: Option<TestEnum> = TestEnum::decode_custom_error_to_enum(3);
 | |
|         assert_eq!(option, None);
 | |
|     }
 | |
| }
 |