use std::fmt::{Display, Formatter}; use std::num::ParseIntError; #[derive(Debug, Clone)] pub enum ByteArrayParseErr { EmptySrcArray, ParseIntError(ParseIntError), } impl From for ByteArrayParseErr { fn from(e: ParseIntError) -> Self { ByteArrayParseErr::ParseIntError(e) } } impl Display for ByteArrayParseErr { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let err_msg = match self { ByteArrayParseErr::EmptySrcArray => "Provided array is empty!".to_string(), ByteArrayParseErr::ParseIntError(e) => format!("Failed to parse as int: {}", e), }; write!(f, "{}", err_msg) } } fn bytes_from_str_array(src: Vec) -> Result, ByteArrayParseErr> { src.iter() .map(|element| { if element.starts_with("0x") || element.starts_with("0X") { u8::from_str_radix(&element[2..], 16) } else if element.starts_with("0b") || element.starts_with("0B") { u8::from_str_radix(&element[2..], 1) } else if element.starts_with('h') || element.starts_with('h') { u8::from_str_radix(&element[1..], 16) } else if let Some(value) = element.strip_prefix('0') { u8::from_str_radix(value, 8) } else { str::parse(element) } }) .map(|e| e.map_err(ByteArrayParseErr::from)) .collect() } pub fn parse_bytes_from_input_arg(src: Vec) -> Result, ByteArrayParseErr> { if src.is_empty() { return Err(ByteArrayParseErr::EmptySrcArray); } let str_arr = if src.len() == 1 { src[0] .replace(',', " ") .replace('[', "") .replace(']', "") .split_whitespace() .map(|s| s.to_string()) .collect() } else { src }; bytes_from_str_array(str_arr) }