push-packet 0.1.0

Packet-inspection and routing library for Linux, built on eBPF XDP and AF_XDP with aya.
Documentation
pub fn format_bytes(b: usize) -> String {
    const K: f64 = 1000.0;
    let b = b as f64;
    if b < K {
        format!("{} B", b as usize)
    } else if b < K * K {
        format!("{:.1} KB", b / K)
    } else if b < K * K * K {
        format!("{:.1} MB", b / (K * K))
    } else {
        format!("{:.2} GB", b / (K * K * K))
    }
}

pub fn format_cells(data: &[String], maxes: &[usize], gap: usize, width: usize) -> String {
    let mut terms = vec![];
    let mut total = 0;
    for (i, value) in data.iter().enumerate() {
        let max = maxes[i];
        let value = format!("{:>width$}", value, width = max);
        let mut len = value.len();
        if i != data.len() - 1 {
            len += gap;
        }
        if total + len >= width {
            break;
        }
        terms.push(value);
        total += len;
    }
    let rem = terms.iter().fold(width, |mut acc, term| {
        acc -= term.len();
        acc
    });
    let div = rem / (terms.len() - 1).max(1);
    let mut output = String::new();
    terms.iter().enumerate().for_each(|(i, term)| {
        output.push_str(term);
        if i < terms.len() {
            output.push_str(&" ".repeat(div));
        }
    });
    output
}