cnt_cli 0.2.0

Command line interface for the embedded counters crate - cnt
use cnt_core::{Counters, CountersBlock};

pub fn list(counters: &Counters) {
    if let Some(ram) = counters.ram_counters() {
        list_entries(ram);
        if counters.bkp_counters().is_some() {
            println!();
        }
    } else {
        println!("No RAM counters found");
    }
    if let Some(bkp) = counters.bkp_counters() {
        list_entries(bkp);
    } else {
        println!("No BKP counters found");
    }
}

fn list_entries(cnt: &CountersBlock) {
    println!(
        "📍 {} address: 0x{:08x} len: {}B",
        cnt.storage(),
        cnt.buffer().addr,
        cnt.buffer().size
    );
    let mut total_size = 0;
    for c in cnt.entries().values() {
        if let Some(location) = &c.location {
            println!("{c} at {location:?}");
        } else {
            println!("{c} at <unknown>");
        }
        total_size += c.ty.len();
    }
    println!("{} total size: {}B", cnt.storage(), total_size);
    let free = cnt.buffer().size as i64 - total_size as i64;
    println!(
        "{} free space: {}B ({}x u32, {}x u64)",
        cnt.storage(),
        free,
        free / 4,
        free / 8
    );
    if free < 0 {
        println!("🛑 Not enough space for {} counters!", cnt.storage());
    }
}