Сложная структура вложенных признаков - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь декодировать сообщения APER, и возникла проблема при создании вложенных структур с признаками. Я использую библиотеку asn1 , но я привел пример для иллюстрации проблемы.

Мне нужна модель, которая может принимать значение, которое может быть любой структурой (более или менее).

Использование ящиков не работает, поскольку черта serial равна Sized. Я не могу заставить работать дженерики, так как функция decode не возвращает тип.

Как мне пройти через это?

use std::fmt::Error;

pub trait serial: Sized {
    fn decode(&self) -> Result<Self, Error>;
}

pub struct Middle {
    pub bottomCode: i32,
    pub value: Box<dyn Bottom>,
}

impl serial for Middle {
    fn decode(&self) -> Result<Self, Error> {
        let code = 1;
        if code == 1 {
            Ok(Middle {
                bottomCode: code,
                value: Box::new(BottomA { a: 1 }),
            })
        } else {
            Ok(Middle {
                bottomCode: code,
                value: Box::new(BottomB { b: 1 }),
            })
        }
    }
}
pub trait Bottom: serial {}
pub struct BottomA {
    pub a: i32,
}
impl Bottom for BottomA {}

pub struct BottomB {
    pub b: i32,
}
impl Bottom for BottomB {}
error[E0038]: the trait `Bottom` cannot be made into an object
 --> src/lib.rs:9:5
  |
9 |     pub value: Box<dyn Bottom>,
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Bottom` cannot be made into an object
  |
  = note: the trait cannot require that `Self : Sized`

error[E0277]: the trait bound `BottomA: serial` is not satisfied
  --> src/lib.rs:32:6
   |
32 | impl Bottom for BottomA {}
   |      ^^^^^^ the trait `serial` is not implemented for `BottomA`

error[E0277]: the trait bound `BottomB: serial` is not satisfied
  --> src/lib.rs:37:6
   |
37 | impl Bottom for BottomB {}
   |      ^^^^^^ the trait `serial` is not implemented for `BottomB`

Черта serial представляет черту APerElement, которую я пытаюсь использовать из библиотеки ASN1, таким образом тип возвращаемого значения и подпись.

Я хочу быть в состоянии вызвать Middle.decode(), что приведет к тому, что все дети будут расшифрованы вместе с ним, и любые дети из тех, кто et c. По этой причине имело смысл также реализовать для нее serial.

Как кто-то может добиться такого поведения? Возможно ли это?

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