postform_persist 0.2.0

Decodes persistent logs for Postform, an efficient logging framework for mcu's
Documentation
use color_eyre::eyre::Result;
use postform_decoder::{ElfMetadata, POSTFORM_VERSION};
use postform_persist::handle_log;
use std::convert::TryInto;
use std::io::prelude::*;
use std::{fs, path::PathBuf};
use structopt::StructOpt;

fn print_version() {
    // version from Cargo.toml e.g. "0.1.4"
    println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
    println!("supported Postform version: {}", POSTFORM_VERSION);
}

#[derive(Debug, StructOpt)]
#[structopt()]
struct Opts {
    /// Path to an ELF firmware file.
    #[structopt(name = "ELF", parse(from_os_str), required_unless_one(&["version"]))]
    elf: Option<PathBuf>,

    /// Path to the binary log file.
    #[structopt(name = "LOG_FILE", parse(from_os_str), required_unless_one(&["version"]))]
    log_file: Option<PathBuf>,

    #[structopt(long, short = "V")]
    version: bool,
}

fn main() -> Result<()> {
    color_eyre::install()?;

    let opts = Opts::from_args();

    if opts.version {
        print_version();
        return Ok(());
    }

    let elf_name = opts.elf.unwrap();
    let elf_metadata = ElfMetadata::from_elf_file(&elf_name)?;

    let mut log_file = fs::File::open(opts.log_file.unwrap())?;
    let mut log_data = vec![];
    log_file.read_to_end(&mut log_data)?;

    let mut log_data = &log_data[..];
    loop {
        let (size_bits, rest) = log_data.split_at(std::mem::size_of::<u32>());
        let size = u32::from_le_bytes(size_bits.try_into().unwrap()) as usize;
        handle_log(&elf_metadata, &rest[..size]);
        log_data = &log_data[4 + size..];
        if log_data.is_empty() {
            break;
        }
    }

    Ok(())
}