cig 0.1.2

Simplify TCP/IP applications with a transparential, persistent-mode and data-driven protocol
Documentation
use std::time::{Duration, SystemTime};

use serde::{Deserialize, Serialize};

use crate::PeerID;

#[derive(Debug, Deserialize, Serialize)]
pub enum PkgData<T> {
    Close,
    SetPeers(Vec<Option<String>>),
    SetPeer(PeerID),
    Data(T, PeerID), // unique
    GlobalData(T),   // to everyone
}

#[derive(Debug, Deserialize, Serialize)]
pub struct Pkg<T> {
    pub sender: PeerID,
    pub time: Duration, // for Instant = UNIX_EPOCH + Duration
    pub data: PkgData<T>,
}

impl<T> Pkg<T> {
    pub fn is_from_server(&self) -> bool {
        self.sender == 0
    }

    pub fn new(sender: PeerID, data: PkgData<T>) -> Self {
        Self {
            sender,
            time: SystemTime::now()
                .duration_since(std::time::UNIX_EPOCH)
                .unwrap(),
            data,
        }
    }

    pub fn as_data(&self) -> &T {
        match self.data {
            PkgData::Data(ref d, _) => d,
            PkgData::GlobalData(ref d) => d,
            _ => panic!("it isn't data"),
        }
    }
}