liserk-shared 0.1.7

Types for liserk zero knowledge database
Documentation
use std::fmt::Display;

use serde::{Deserialize, Deserializer, Serialize};
use tracing::debug;

#[derive(Debug, Serialize)]
#[repr(u8)]
pub enum MessageType {
    Setup,
    Authentification,
    Insert,
    InsertOpe,
    InsertResponse,
    Query,
    QueryResponse,
    SingleValueResponse,
    Count,
    Update,
    UpdateResponse,
    Delete,
    DeleteResult,
    DeleteForUsecase,
    Drop,
    DropResult,
    EndOfCommunication,
    CloseCommunication,
}

impl Display for MessageType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            MessageType::Setup => write!(f, "Setup communcication"),
            MessageType::Authentification => write!(f, "Authentification"),
            MessageType::Insert => write!(f, "Insert"),
            MessageType::InsertOpe => write!(f, "InsertOpe"),
            MessageType::InsertResponse => write!(f, "InsertResponse"),
            MessageType::Query => write!(f, "Query"),
            MessageType::QueryResponse => write!(f, "QueryResponse"),
            MessageType::SingleValueResponse => write!(f, "SingleValueResponse"),
            MessageType::Count => todo!(),
            MessageType::Update => write!(f, "Update"),
            MessageType::UpdateResponse => write!(f, "UpdateResponse"),
            MessageType::Delete => write!(f, "Delete"),
            MessageType::DeleteResult => write!(f, "DeleteResult"),
            MessageType::DeleteForUsecase => write!(f, "DeleteForUsecase"),
            MessageType::Drop => write!(f, "Drop"),
            MessageType::DropResult => write!(f, "DropResult"),
            MessageType::EndOfCommunication => write!(f, "EndOfCommunication"),
            MessageType::CloseCommunication => write!(f, "CloseCommunication"),
        }
    }
}

impl<'de> Deserialize<'de> for MessageType {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        debug!("parsing message type: {}", s);

        if s == "Setup" {
            return Ok(MessageType::Setup);
        }

        if s == "Authentification" {
            return Ok(MessageType::Authentification);
        }

        if s == "Insert" {
            return Ok(MessageType::Insert);
        }

        if s == "InsertOpe" {
            return Ok(MessageType::InsertOpe);
        }

        if s == "InsertResponse" {
            return Ok(MessageType::InsertResponse);
        }

        if s == "Query" {
            return Ok(MessageType::Query);
        }

        if s == "QueryResponse" {
            return Ok(MessageType::QueryResponse);
        }

        if s == "SingleValueResponse" {
            return Ok(MessageType::SingleValueResponse);
        }

        if s == "Count" {
            return Ok(MessageType::Count);
        }

        if s == "Update" {
            return Ok(MessageType::Update);
        }

        if s == "UpdateResponse" {
            return Ok(MessageType::UpdateResponse);
        }

        if s == "Delete" {
            return Ok(MessageType::Delete);
        }

        if s == "DeleteResult" {
            return Ok(MessageType::DeleteResult);
        }

        if s == "DeleteForUsecase" {
            return Ok(MessageType::DeleteForUsecase);
        }

        if s == "Drop" {
            return Ok(MessageType::Drop);
        }

        if s == "DeleteResult" {
            return Ok(MessageType::DropResult);
        }

        if s == "EndOfCommunication" {
            return Ok(MessageType::EndOfCommunication);
        }

        if s == "CloseCommunication" {
            return Ok(MessageType::CloseCommunication);
        }
        panic!("panic deserialize message type");
    }
}

#[derive(Debug, Default, thiserror::Error)]
#[error("fail to parse MessageType")]
pub struct MessageTypeError {}

impl TryFrom<u8> for MessageType {
    type Error = MessageTypeError;

    fn try_from(v: u8) -> Result<Self, Self::Error> {
        match v {
            0 => Ok(MessageType::Setup),
            1 => Ok(MessageType::Authentification),
            2 => Ok(MessageType::Insert),
            3 => Ok(MessageType::InsertResponse),
            4 => Ok(MessageType::Query),
            5 => Ok(MessageType::QueryResponse),
            6 => Ok(MessageType::SingleValueResponse),
            7 => Ok(MessageType::Count),
            8 => Ok(MessageType::Update),
            9 => Ok(MessageType::UpdateResponse),
            10 => Ok(MessageType::Delete),
            11 => Ok(MessageType::DeleteResult),
            12 => Ok(MessageType::DeleteForUsecase),
            13 => Ok(MessageType::Drop),
            14 => Ok(MessageType::DropResult),
            15 => Ok(MessageType::EndOfCommunication),
            16 => Ok(MessageType::CloseCommunication),
            17 => Ok(MessageType::InsertOpe),
            _ => Err(MessageTypeError::default()),
        }
    }
}