speck-core 0.2.0

Secure runtime package manager for MMU-less microcontrollers
Documentation
//! I/O utilities for no-std environments

use alloc::vec::Vec;
use crate::error::Result;

/// Streaming reader for memory-efficient parsing
pub struct StreamingReader<'a> {
    data: &'a [u8],
    position: usize,
}

impl<'a> StreamingReader<'a> {
    /// Create new reader
    pub fn new(data: &'a [u8]) -> Self {
        Self { data, position: 0 }
    }
    
    /// Read exact number of bytes
    pub fn read_exact(&mut self, len: usize) -> Result<&'a [u8]> {
        if self.position + len > self.data.len() {
            return Err(crate::Error::invalid_format("unexpected EOF"));
        }
        let result = &self.data[self.position..self.position + len];
        self.position += len;
        Ok(result)
    }
    
    /// Read u32 in little-endian
    pub fn read_u32_le(&mut self) -> Result<u32> {
        let bytes = self.read_exact(4)?;
        Ok(u32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]))
    }
    
    /// Read u64 in little-endian
    pub fn read_u64_le(&mut self) -> Result<u64> {
        let bytes = self.read_exact(8)?;
        Ok(u64::from_le_bytes([
            bytes[0], bytes[1], bytes[2], bytes[3],
            bytes[4], bytes[5], bytes[6], bytes[7],
        ]))
    }
    
    /// Remaining bytes
    pub fn remaining(&self) -> usize {
        self.data.len() - self.position
    }
    
    /// Check if exhausted
    pub fn is_empty(&self) -> bool {
        self.position >= self.data.len()
    }
}