pea2pea 0.27.0

A small library allowing simple and quick creation of custom P2P nodes and networks.
Documentation
#![allow(dead_code)]

use tracing_subscriber::filter::{EnvFilter, LevelFilter};

use std::{
    convert::TryInto,
    io::{self, Read},
};

pub fn start_logger(default_level: LevelFilter) {
    let filter = match EnvFilter::try_from_default_env() {
        Ok(filter) => filter.add_directive("mio=off".parse().unwrap()),
        _ => EnvFilter::default()
            .add_directive(default_level.into())
            .add_directive("mio=off".parse().unwrap()),
    };

    tracing_subscriber::fmt()
        .with_env_filter(filter)
        .without_time()
        .with_target(false)
        .init();
}

pub fn read_len_prefixed_message<R: io::Read, const N: usize>(
    reader: &mut R,
) -> io::Result<Option<Vec<u8>>> {
    let mut len_arr = [0u8; N];
    if reader.read_exact(&mut len_arr).is_err() {
        return Ok(None);
    }
    let payload_len = match N {
        2 => u16::from_le_bytes(len_arr[..].try_into().unwrap()) as usize,
        4 => u32::from_le_bytes(len_arr[..].try_into().unwrap()) as usize,
        _ => unreachable!(),
    };

    if payload_len == 0 {
        return Err(io::ErrorKind::InvalidData.into());
    }

    let mut buffer = vec![0u8; payload_len];
    if reader
        .take(payload_len as u64)
        .read_exact(&mut buffer)
        .is_err()
    {
        Ok(None)
    } else {
        Ok(Some(buffer))
    }
}

pub fn prefix_with_len(len_size: usize, message: &[u8]) -> Vec<u8> {
    let mut vec = Vec::with_capacity(len_size + message.len());

    match len_size {
        2 => vec.extend_from_slice(&(message.len() as u16).to_le_bytes()),
        4 => vec.extend_from_slice(&(message.len() as u32).to_le_bytes()),
        _ => unreachable!(),
    }

    vec.extend_from_slice(message);

    vec
}