40 lines
814 B
Rust
40 lines
814 B
Rust
#[derive(Debug, PartialEq)]
|
|
pub struct Packet {
|
|
pub version: usize,
|
|
pub kind: Kind,
|
|
}
|
|
|
|
impl Packet {
|
|
pub fn sum_of_version_numbers(&self) -> usize {
|
|
match &self.kind {
|
|
Kind::Operator(op) => {
|
|
op.sub_packets
|
|
.iter()
|
|
.map(|sub| sub.sum_of_version_numbers())
|
|
.sum::<usize>()
|
|
+ self.version
|
|
}
|
|
Kind::LiteralValue(_) => self.version,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, PartialEq)]
|
|
pub enum Kind {
|
|
Operator(Operator),
|
|
LiteralValue(usize),
|
|
}
|
|
|
|
#[derive(Debug, PartialEq)]
|
|
pub struct Operator {
|
|
pub opcode: usize,
|
|
pub length: Length,
|
|
pub sub_packets: Vec<Packet>,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq)]
|
|
pub enum Length {
|
|
Count(usize),
|
|
Length(usize),
|
|
}
|