use serde::{Deserialize, Serialize};
use strum_macros::{Display, EnumIter};
use crate::config::compression::CompressionVariant;
#[derive(Debug, Default, Serialize, Deserialize, EnumIter, PartialEq, Display)]
pub enum DestinationMode {
#[default]
SingleFile,
MultipleFiles,
RecusiveDirectory,
}
#[derive(Debug, Serialize, Deserialize, EnumIter)]
#[allow(variant_size_differences)]
pub enum ServerCommand {
GetFreePort((Option<u16>, Option<u16>)),
Prealloc(u64, String),
ReceiveData(u32, String, Option<CompressionVariant>),
EndOfTransfer,
IsDestinationValid(DestinationMode, String),
}
impl ServerCommand {
pub const HEADER_SIZE: usize = 1;
pub fn size_from_bytes(raw_header: [u8; Self::HEADER_SIZE]) -> usize {
u8::from_be_bytes(raw_header) as usize
}
}
#[derive(Debug, Serialize, Deserialize, EnumIter, PartialEq)]
pub enum ServerResult {
Ok,
Err(Box<str>),
}
impl ServerResult {
pub const HEADER_SIZE: usize = 2;
pub fn err<S>(err_msg: S) -> Self
where
S: Into<Box<str>>,
{
Self::Err(err_msg.into())
}
pub fn size_from_bytes(raw_header: [u8; Self::HEADER_SIZE]) -> usize {
u16::from_be_bytes(raw_header) as usize
}
}
#[cfg(test)]
mod tests {
use super::*;
use strum::IntoEnumIterator;
use testresult::TestResult;
#[test]
fn test_command_serialized_size_constraint() -> TestResult {
let enum_size = std::mem::size_of::<ServerCommand>();
eprintln!("Enum size: {enum_size}");
assert!(enum_size < 255);
for cmd_variant in ServerCommand::iter() {
let serialized = bincode::serialize(&cmd_variant)?;
let serialized_size = serialized.len();
eprintln!("Serialized {cmd_variant:?} size={serialized_size}");
assert!(serialized_size < 128);
}
Ok(())
}
}