diff --git a/enum_derive/src/lib.rs b/enum_derive/src/lib.rs index 7645519..567d874 100644 --- a/enum_derive/src/lib.rs +++ b/enum_derive/src/lib.rs @@ -29,6 +29,7 @@ macro_attr! { } # fn main() { +use enum_derive::IterVariantNames; let vars: CandyVariants = Candy::iter_variants(); let names: CandyVariantNames = Candy::iter_variant_names(); assert_eq!(&*vars.zip(names).collect::>(), &[ @@ -453,9 +454,10 @@ macro_rules! IterVariantNames { enum_derive_util! { @as_item - impl $name { - #[allow(dead_code)] - $($pub_)* fn iter_variant_names() -> $itername { + impl ::enum_derive::IterVariantNames for $name { + type Iterator = $itername; + + fn iter_variant_names() -> $itername { $itername } } @@ -471,9 +473,10 @@ macro_rules! IterVariantNames { enum_derive_util! { @as_item - impl $name { - #[allow(dead_code)] - $($pub_)* fn iter_variant_names() -> $itername { + impl ::enum_derive::IterVariantNames for $name { + type Iterator = $itername; + + fn iter_variant_names() -> $itername { $itername(::std::option::Option::Some(enum_derive_util!(@first_expr $($name::$var_names),+))) } } @@ -966,3 +969,9 @@ macro_rules! EnumInnerAsTrait { } }; } + +pub trait IterVariantNames { + type Iterator: Iterator; + + fn iter_variant_names() -> Self::Iterator; +} diff --git a/enum_derive/tests/iter.rs b/enum_derive/tests/iter.rs index 89264e1..285b341 100644 --- a/enum_derive/tests/iter.rs +++ b/enum_derive/tests/iter.rs @@ -10,6 +10,8 @@ or distributed except according to those terms. #[macro_use] extern crate enum_derive; #[macro_use] extern crate macro_attr; +use enum_derive::IterVariantNames; + macro_attr! { #[derive(Debug, PartialEq, IterVariants!(GetVariants), IterVariantNames!(GetVariantNames))] pub enum Get {