#![allow(clippy::unbuffered_bytes)]
use crate::models::{Line, Page};
use std::error::Error;
use std::io::Read;
pub fn buf_to_array(
buf: &mut dyn Read,
buf_len: u64,
column_width: u64,
) -> Result<Page, Box<dyn Error>> {
let mut column_count: u64 = 0x0;
let max_array_size: u16 = <u16>::MAX; let mut page: Page = Page::new();
let mut line: Line = Line::new();
for b in buf.bytes() {
let b1: u8 = b?;
line.bytes += 1;
page.bytes += 1;
line.hex_body.push(b1);
column_count += 1;
if column_count >= column_width {
page.body.push(line);
line = Line::new();
column_count = 0;
}
if buf_len > 0 && (page.bytes == buf_len || u64::from(max_array_size) == buf_len) {
break;
}
}
page.body.push(line);
Ok(page)
}
#[cfg(test)]
mod tests {
use super::*;
use std::io;
#[test]
fn test_buf_to_array_empty() {
let mut buf = io::Cursor::new(vec![]);
let page = buf_to_array(&mut buf, 0, 10).unwrap();
assert_eq!(page.bytes, 0);
assert_eq!(page.body.len(), 1); }
#[test]
fn test_buf_to_array_exact_column() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let mut buf = io::Cursor::new(data);
let page = buf_to_array(&mut buf, 0, 10).unwrap();
assert_eq!(page.bytes, 10);
assert_eq!(page.body.len(), 2); }
#[test]
fn test_buf_to_array_truncation() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let mut buf = io::Cursor::new(data);
let page = buf_to_array(&mut buf, 5, 10).unwrap();
assert_eq!(page.bytes, 5);
}
#[test]
fn test_buf_to_array_multiple_lines() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
let mut buf = io::Cursor::new(data);
let page = buf_to_array(&mut buf, 0, 5).unwrap();
assert_eq!(page.bytes, 12);
assert_eq!(page.body.len(), 3); }
#[test]
fn test_buf_to_array_single_byte() {
let data = vec![0x42];
let mut buf = io::Cursor::new(data);
let page = buf_to_array(&mut buf, 0, 10).unwrap();
assert_eq!(page.bytes, 1);
assert_eq!(page.body.len(), 1);
assert_eq!(page.body[0].hex_body[0], 0x42);
}
#[test]
fn test_buf_to_array_column_width_one() {
let data = vec![1, 2, 3];
let mut buf = io::Cursor::new(data);
let page = buf_to_array(&mut buf, 0, 1).unwrap();
assert_eq!(page.bytes, 3);
assert_eq!(page.body.len(), 4); }
#[test]
fn test_buf_to_array_data_integrity() {
let data: Vec<u8> = (0..16).collect();
let mut buf = io::Cursor::new(data.clone());
let page = buf_to_array(&mut buf, 0, 8).unwrap();
let mut reconstructed: Vec<u8> = Vec::new();
for line in page.body.iter() {
reconstructed.extend(&line.hex_body);
}
assert_eq!(reconstructed, data);
}
}