Как мне получить примитивное представление обобщенного перечисления c в Rust? - PullRequest
2 голосов
/ 28 марта 2020

У меня есть функция, которая читает биты и создает перечисление. В настоящее время вызывающая сторона должна предоставить как EnumType, так и представление этого перечисления. Как изменить функцию таким образом, чтобы представление выводилось из EnumType, чтобы вызывающему требовалось только предоставить EnumType, а не его представление?

// Example enum:
use num_enum::TryFromPrimitive;
#[derive(Debug, Clone, Copy, TryFromPrimitive)]
#[repr(u8)]
pub enum VehicleType {
    Boat = 0,
    Car = 1,
}

// Example of current functional call
extract_enum_bits::<VehicleType, u8>(&data, 2, 6);

// Current function:
fn extract_enum_bits<EnumType: std::convert::TryFrom<Repr>, Repr: ReadInto>(data: &[u8],start_bit: u64, bits_to_read: u8) -> EnumType
where <EnumType as std::convert::TryFrom<Repr>>::Error : std::fmt::Debug {
    let enum_as_repr_int = extract_bits::<Repr>(&data, start_bit, bits_to_read);
    EnumType::try_from(enum_as_repr_int).unwrap()
}

Синтаксис вызова функции поиска:

extract_enum_bits::<VehicleType>(&data, 2, 6)

Как можно изменить функцию extract_enum_bits для поддержки этого нового синтаксиса вызова?

Или для формулировки вопроса по-другому. Как получить тип представления enum (в этом примере u8) в вопросительных знаках, а также удовлетворить требование "std :: convert :: From", наложенное ":: try_from" в последней строке?

pub fn extract_enum_bits<EnumType: TryFromPrimitive>(data: &[u8],start_bit: u64, bits_to_read: u8) -> EnumType {
    let enum_as_repr_int = extract_bits::< ???? >(&data, start_bit, bits_to_read);
    EnumType::try_from(enum_as_repr_int).unwrap()
}
...