use crate::buffer::buf_to_array;
use crate::format::Format;
use std::error::Error;
use std::io::{self, BufRead, Write};
pub fn output_array(
array_format: &str,
mut buf: Box<dyn BufRead>,
truncate_len: u64,
column_width: u64,
) -> Result<(), Box<dyn Error>> {
let stdout = io::stdout();
let mut locked = stdout.lock();
let page = buf_to_array(&mut buf, truncate_len, column_width)?;
match array_format {
"r" => writeln!(locked, "let ARRAY: [u8; {}] = [", page.bytes)?,
"c" => writeln!(locked, "unsigned char ARRAY[{}] = {{", page.bytes)?,
"g" => writeln!(locked, "a := [{}]byte{{", page.bytes)?,
"p" => writeln!(locked, "a = [")?,
"k" => writeln!(locked, "val a = byteArrayOf(")?,
"j" => writeln!(locked, "byte[] a = new byte[]{{")?,
"s" => writeln!(locked, "let a: [UInt8] = [")?,
"f" => writeln!(locked, "let a = [|")?,
_ => writeln!(locked, "unknown array format")?,
}
let mut i: u64 = 0x0;
for line in page.body.iter() {
write!(locked, " ")?;
for hex in line.hex_body.iter() {
i += 1;
let hex_str = Format::LowerHex
.format(*hex, true)
.map_err(|e| io::Error::new(io::ErrorKind::InvalidInput, e))?;
if i == page.bytes && array_format != "g" {
if array_format != "f" {
write!(locked, "{}", hex_str)?;
} else {
write!(locked, "{}uy", hex_str)?;
}
} else if array_format != "f" {
write!(locked, "{}, ", hex_str)?;
} else {
write!(locked, "{}uy; ", hex_str)?;
}
}
writeln!(locked)?;
}
writeln!(
locked,
"{}",
match array_format {
"r" => "];",
"c" | "j" => "};",
"g" => "}",
"p" => "]",
"k" => ")",
"s" => "]",
"f" => "|]",
_ => "unknown array format",
}
)
.map_err(|e| -> Box<dyn Error> { Box::new(e) })
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Cursor;
fn create_test_buffer(data: Vec<u8>) -> Box<dyn BufRead> {
Box::new(Cursor::new(data))
}
#[test]
fn test_output_array_rust() {
let data = vec![0x42, 0x43, 0x44];
let buf = create_test_buffer(data);
let result = output_array("r", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_c() {
let data = vec![0x01, 0x02, 0x03];
let buf = create_test_buffer(data);
let result = output_array("c", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_go() {
let data = vec![0x10, 0x20, 0x30];
let buf = create_test_buffer(data);
let result = output_array("g", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_python() {
let data = vec![0xAA, 0xBB];
let buf = create_test_buffer(data);
let result = output_array("p", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_kotlin() {
let data = vec![0xFF];
let buf = create_test_buffer(data);
let result = output_array("k", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_java() {
let data = vec![0x11, 0x22, 0x33];
let buf = create_test_buffer(data);
let result = output_array("j", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_swift() {
let data = vec![0x99];
let buf = create_test_buffer(data);
let result = output_array("s", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_fsharp() {
let data = vec![0x55, 0x66];
let buf = create_test_buffer(data);
let result = output_array("f", buf, 0, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_unknown_format() {
let data = vec![0x42];
let buf = create_test_buffer(data);
let result = output_array("x", buf, 0, 10);
assert!(result.is_ok()); }
#[test]
fn test_output_array_truncation() {
let data: Vec<u8> = (0..20).collect();
let buf = create_test_buffer(data);
let result = output_array("r", buf, 10, 10);
assert!(result.is_ok());
}
#[test]
fn test_output_array_empty() {
let data = vec![];
let buf = create_test_buffer(data);
let result = output_array("r", buf, 0, 10);
assert!(result.is_ok());
}
}