enigma-packet 0.1.0

Canonical message packet format + serialization for Enigma secure messaging
Documentation
use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MessageType {
    Text,
    Voice,
    Image,
    Video,
    File,
    CallOffer,
    CallAnswer,
    CallHangup,
    GroupInvite,
    AttachmentInit,
    AttachmentChunk,
    AttachmentEnd,
    AttachmentAbort,
    AttachmentAck,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AttachmentKind {
    File,
    Image,
    Video,
    Voice,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AttachmentMeta {
    pub attachment_id: Uuid,
    pub kind: AttachmentKind,
    pub filename: Option<String>,
    pub content_type: Option<String>,
    pub total_size: u64,
    pub chunk_size: u32,
    pub chunk_count: u32,
    pub sha256: Option<[u8; 32]>,
    pub created_at_ms: Option<u64>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AttachmentChunkMeta {
    pub attachment_id: Uuid,
    pub index: u32,
    pub offset: u64,
    pub chunk_size: u32,
    pub total_size: Option<u64>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AttachmentAckMeta {
    pub attachment_id: Uuid,
    pub received_up_to_index: Option<u32>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MessageMeta {
    None,
    Basic {
        content_type: Option<String>,
    },
    AttachmentInit(AttachmentMeta),
    AttachmentChunk(AttachmentChunkMeta),
    AttachmentEnd {
        attachment_id: Uuid,
        sha256: Option<[u8; 32]>,
        total_size: u64,
        chunk_count: u32,
    },
    AttachmentAbort {
        attachment_id: Uuid,
        reason: Option<String>,
    },
    AttachmentAck(AttachmentAckMeta),
}

impl Default for MessageMeta {
    fn default() -> Self {
        MessageMeta::None
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Message {
    pub id: Uuid,
    pub sender: String,
    pub receiver: String,
    pub timestamp_ms: u64,
    pub msg_type: MessageType,
    pub payload: Vec<u8>,
    pub meta: MessageMeta,
}