Может иметь смысл писать типы-обертки, как вы предлагали, но только если этот тип необходим в больших частях вашего кода.
Ваш конкретный пример будет определять новое перечисление каждый раз, когда вы используете макроспереместите значение в новое перечисление, а затем сразу же выбросите его.
Это не идиоматический подход, и если это действительно ваше воображаемое использование, я бы порекомендовал поискать другие варианты.
Этосказал, что я использовал типы обертки в ряде случаев.
Примерно так будет работать для объявления обертки:
macro_rules! declare_wrapper {
(
$enum_name:ident {
$( $variant_name:ident( $typ:ty : $description:expr ) ),*
}
)=> {
pub enum $enum_name {
$(
$variant_name($typ),
)*
}
$(
impl From<$typ> for $enum_name {
fn from(value: $typ) -> Self {
$enum_name::$variant_name(value)
}
}
)*
impl $enum_name {
fn describe(&self) -> &'static str {
match self {
$(
&$enum_name::$variant_name(_) => $description,
)*
}
}
}
};
}
declare_wrapper!( MyWrapper {
MyInt(i64 : "int"),
MyString(String : "string")
});
fn main() {
let value = MyWrapper::from(22);
println!("{}", value.describe());
}
Вы также можете расширить это, чтобы добавить дополнительные методы или признаки характерачто тебе нужно.Я делал подобные вещи довольно часто.