Мне нужно сослаться на значение в глубине структуры, которая включает Option
, вложенное в свойство struct
, вложенное в Result
.
Мое текущее (рабочее) решение:
let raw = &packet[16..];
match PacketHeaders::from_ip_slice(raw) {
Err(_value) => {
/* ignore */
},
Ok(value) => {
match value.ip {
Some(Version4(header)) => {
let key = format!("{}.{}.{}.{},{}.{}.{}.{}",
header.source[0], header.source[1], header.source[2], header.source[3],
header.destination[0], header.destination[1], header.destination[2], header.destination[3],
);
let Count {packets, bytes} = counts.entry(key).or_insert(Count {packets: 0, bytes: 0});
*packets += 1;
*bytes += packet.len();
if p > 1000 { /* exit after 1000 packets */
for (key, value) in counts {
println!("{},{},{}", key, value.packets, value.bytes);
}
return ();
}
p += 1;
}
_ => {
/* ignore */
}
}
}
}
(Проблема с моим текущим кодом - это чрезмерное вложение и два совпадения.)
Все, что мне нужно, это PacketHeaders::from_ip_slice(ip) >> Ok >> ip >> Some >> Version4
.
Как я могу это получить или игнорировать сбой (НЕ сбой / выход) для каждого захваченного пакета?