2 个版本
使用旧的 Rust 2015
0.1.3 | 2015 年 7 月 8 日 |
---|---|
0.1.2 | 2015 年 7 月 8 日 |
0.1.1 |
|
0.1.0 |
|
#8 在 #eve
在 tabin-plugins 中使用
4KB
78 行
//! wrapped_enum! - 将多个类型封装到 Enum 中 //! //! 当需要返回多个类型时很有用。只需要处理已知类型的枚举即可。 //! //! 使用公共枚举时需要文档说明 //! //! //! # #[macro_use] extern crate wrapped_enum; //! # use std::io; //! #[derive(Debug)] //! pub enum TestError { //! ErrorA, //! ErrorB(u8, u16), //! ErrorC(String), //! } //! //! wrapped_enum!{ //! #[derive(Debug)] //! /// 对您的 pub 枚举进行文档说明 //! pub enum DocumentedEnum { //! /// 变体也太多。Io(io::Error), //! /// 对 pub 枚举的文档说明是必需的 Test(TestError), //! /// 未知错误 Unknown(()), //! } //! } //! //! wrapped_enum!{ //! #[derive(Debug, Eq, PartialEq)] //! /// 您不能对私有变体进行文档说明 //! enum UndocumentedEnum { //! // 然而,正常的注释是没有问题的!Byte(u8), // 00-FF //! DoubleByte(u16), // 0000-FFFF //! } //! } //! //! # fn main() { //! assert!(UndocumentedEnum::from(0u8) == UndocumentedEnum::Byte(0)); //! assert!(UndocumentedEnum::from(0u16) == UndocumentedEnum::DoubleByte(0)); //! # } //!
#[macro_export] macro_rules! wrapped_enum { ($(#[$attr:meta])* pub enum $enum_name:ident { $($(#[$variant_attr:meta])+ $enum_variant_name:ident($ty:ty)),+ $(,)* } ) => ( $(#[$attr])* pub enum $enum_name { $($(#[$variant_attr])+ $enum_variant_name($ty)),+ } $(impl From<$ty> for $enum_name { fn from (ty: $ty) -> Self { $enum_name::$enum_variant_name(ty) } })+ ); ($(#[$attr:meta])* enum $enum_name:ident { $($enum_variant_name:ident($ty:ty)),+ $(,)* } ) => ( $(#[$attr])* enum $enum_name { $($enum_variant_name($ty)),+ } $(impl From<$ty> for $enum_name { fn from (ty: $ty) -> Self { $enum_name::$enum_variant_name(ty) } })+ ); }
#[cfg(test)] mod test { #[derive(Debug)] #[allow(dead_code)] pub enum CommunicationError { HumanError(Human, ErrorAction), UnknownError, }
#[derive(Debug)]
#[allow(dead_code)]
pub enum ErrorAction {
AttemptedToStealSecrets,
StoleSecrets,
}
#[derive(Debug)]
#[allow(dead_code)]
pub enum Human {
Alice, // Good
Bob, // Good
Carol, // Good
Dave, // Good
Eve, // Bad
}
wrapped_enum!{
#[derive(Debug)]
/// Document your pub enums
pub enum TestError {
// /// 变体也太多。Io(io::Error), /// 对 pub 枚举的文档说明是必需的 Test(CommunicationError), /// 未知错误 Unknown(()), } }
wrapped_enum!{
#[derive(Debug)]
/// You can't document private variants
enum UndocumentedEnum {
// However, there is nothing wrong with normal comments
Byte(u8), // 00-FF
DoubleByte(u16), // 0000-FFFF
}
}
#[test]
fn eve_intercept_alice_and_bobs_communication() {
let error: Result<(), CommunicationError> =
Err(CommunicationError::HumanError(Human::Eve,
ErrorAction::AttemptedToStealSecrets));
let result: Result<(), TestError> = error.map_err(From::from);
assert!(result.is_err());
}
}