runtime_tracing 0.15.0

A library for the schema and tracing helpers for the CodeTracer db trace format
Documentation
use std::io::{self, BufRead, BufReader, Read, Seek, Write};

use fscommon::StreamSlice;

use ruzstd::decoding::StreamingDecoder;

use crate::{TraceLowLevelEvent, cbor_zstd_writer::HEADERV1};

fn is_at_eof<R: BufRead>(reader: &mut R) -> io::Result<bool> {
    let buffer = reader.fill_buf()?;
    Ok(buffer.is_empty())
}

pub fn read_trace(input: &mut (impl Read + Write + Seek)) -> Result<Vec<TraceLowLevelEvent>, Box<dyn std::error::Error>> {
    let end_pos = input.seek(io::SeekFrom::End(0))?;
    input.seek(io::SeekFrom::Start(0))?;

    let mut header_buf = [0; 8];
    let mut buf_reader = BufReader::new(&mut *input);
    buf_reader.read_exact(&mut header_buf)?;
    if header_buf != HEADERV1 {
        panic!("Invalid file header (wrong file format or incompatible version)");
    }

    input.seek(io::SeekFrom::Start(0))?;
    let input2 = StreamSlice::new(&mut *input, 8, end_pos)?;

    let decoder = StreamingDecoder::new(input2)?;
    let mut buf_reader = BufReader::new(decoder);

    let mut result: Vec<TraceLowLevelEvent> = vec![];

    while !is_at_eof(&mut buf_reader)? {
        let obj = cbor4ii::serde::from_reader::<TraceLowLevelEvent, _>(&mut buf_reader)?;
        result.push(obj);
    }

    Ok(result)
}