Макрос Rust для преобразования между одинаковыми перечислениями - PullRequest
1 голос
/ 30 января 2020

Предположим, у меня есть два идентичных перечисления (не спрашивайте, почему):

enum Foo {
  A,
  B,
  C,
  D,
}

enum Bar {
  A,
  B,
  C,
  D,
}

Можно ли использовать макрос для автоматического преобразования между ними без необходимости писать этот утомительный код:

let f: Foo = match b {
  Bar::A => Foo::A,
  Bar::B => Foo::B,
  Bar::C => Foo::C,
  Bar::D => Foo::D,
};

Бонусные баллы: возможно ли сделать это для двух идентичных структур?

Редактировать: Пара разъяснений - по крайней мере одно из перечислений уже существует в коде и не может быть отредактировано (в моем случае это сгенерированный код, но он также может быть из внешнего ящика). Также я понимаю, что вы можете сделать это с макросами pro c, потому что они в принципе могут делать что угодно, но я ищу что-то попроще, если оно существует.

Если это невозможно, это тоже правильный ответ.

1 Ответ

1 голос
/ 30 января 2020

Если вы согласитесь повторить варианты перечисления один раз, может помочь следующее:

enum Foo {
  A,
  B,
  C,
  D,
}

enum Bar {
  A,
  B,
  C,
  D,
}

macro_rules! convert_enum{($src: ident, $dst: ident, $($variant: ident,)*)=> {
    impl From<$src> for $dst {
        fn from(src: $src) -> Self {
            match src {
                $($src::$variant => Self::$variant,)*
            }
        }
    }
}}

convert_enum!(Foo, Bar, A, B, C, D,);

Это может, конечно, уже генерировать обратное направление. Более того, я думаю, что его можно адаптировать для структур или перечислений, содержащих более сложные варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...