cig/
pkg.rs

1use std::time::{Duration, SystemTime};
2
3use serde::{Deserialize, Serialize};
4
5use crate::PeerID;
6
7#[derive(Debug, Deserialize, Serialize)]
8pub enum PkgData<T> {
9    Close,
10    SetPeers(Vec<Option<String>>),
11    SetPeer(PeerID),
12    Data(T, PeerID), // unique
13    GlobalData(T),   // to everyone
14}
15
16#[derive(Debug, Deserialize, Serialize)]
17pub struct Pkg<T> {
18    pub sender: PeerID,
19    pub time: Duration, // for Instant = UNIX_EPOCH + Duration
20    pub data: PkgData<T>,
21}
22
23impl<T> Pkg<T> {
24    pub fn is_from_server(&self) -> bool {
25        self.sender == 0
26    }
27
28    pub fn new(sender: PeerID, data: PkgData<T>) -> Self {
29        Self {
30            sender,
31            time: SystemTime::now()
32                .duration_since(std::time::UNIX_EPOCH)
33                .unwrap(),
34            data,
35        }
36    }
37
38    pub fn as_data(&self) -> &T {
39        match self.data {
40            PkgData::Data(ref d, _) => d,
41            PkgData::GlobalData(ref d) => d,
42            _ => panic!("it isn't data"),
43        }
44    }
45}