Я пытаюсь декодировать сообщения 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
.
Как кто-то может добиться такого поведения? Возможно ли это?