ambient_proxy 0.3.5

NAT traversal proxy for Ambient game engine
Documentation
use std::mem::size_of;

use bytes::{Buf, BufMut, Bytes, BytesMut};
use serde::{Deserialize, Serialize};

pub fn prefix<T: Serialize>(header: &T, data: Bytes) -> bincode::Result<Bytes> {
    let header = bincode::serialize(header)?;
    let mut buffer = BytesMut::with_capacity(size_of::<u32>() + header.len() + data.len());
    buffer.put_u32(header.len() as u32);
    buffer.put_slice(&header);
    buffer.put(data);
    Ok(buffer.freeze())
}

pub fn drop_prefix<T: for<'de> Deserialize<'de>>(data: Bytes) -> bincode::Result<(T, Bytes)> {
    let mut data = data;
    let header_len = data.get_u32() as usize;
    let header = bincode::deserialize(&data[..header_len])?;
    data.advance(header_len);
    Ok((header, data))
}

pub fn to_binary_prefix(count: impl Into<u64>) -> String {
    let count = count.into();
    if count < 1024 * 10 {
        format!("{count}")
    } else if count < 1024 * 1024 * 10 {
        format!("{}K", count / 1024)
    } else if count < 1024 * 1024 * 1024 * 10 {
        format!("{}M", count / 1024 / 1024)
    } else {
        format!("{}G", count / 1024 / 1024 / 1024)
    }
}