mod serialization {
include!(concat!(env!("OUT_DIR"), "/protobuf_generated/generated.rs"));
}
use protobuf::Parse;
pub struct InitialPayload {
pub passports: Vec<String>,
pub other_peers: Vec<String>,
pub room_id: Option<String>,
pub data: Option<Vec<u8>>,
}
pub enum Packet {
Init(InitialPayload),
Data(Vec<u8>),
}
use serialization::base_packet::PacketOneof;
pub(crate) fn deserialize_packet(packet: &[u8]) -> Result<Packet, protobuf::ParseError> {
let base = serialization::BasePacket::parse(packet.into())?;
match base.packet() {
PacketOneof::not_set(_) => Err(protobuf::ParseError),
PacketOneof::UpdatePacket(_) => todo!(),
PacketOneof::DataPacket(data_packet) => Ok(Packet::Data(data_packet.data().to_vec())),
PacketOneof::InitPacket(init_packet) => {
Ok(Packet::Init(InitialPayload
{
passports: init_packet.passports().into_iter().map(|x| {x.jwt().to_string()}).collect(),
other_peers: init_packet.other_peers().into_iter().map(|x|{x.to_string()}).collect(),
room_id: if init_packet.has_room_id() {Some(init_packet.room_id().to_string())} else {None},
data: if init_packet.has_data() { Some(init_packet.data().to_vec()) } else {None}
}
))
},
}
}