2022-04-09 18:34:15 +00:00
|
|
|
use std::fmt::{Display, Formatter};
|
2022-04-09 18:40:37 +00:00
|
|
|
use std::num::ParseIntError;
|
2021-09-11 18:21:34 +00:00
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum ByteArrayParseErr {
|
|
|
|
EmptySrcArray,
|
|
|
|
ParseIntError(ParseIntError),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<ParseIntError> for ByteArrayParseErr {
|
|
|
|
fn from(e: ParseIntError) -> Self {
|
|
|
|
ByteArrayParseErr::ParseIntError(e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-09 18:34:15 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-11 18:21:34 +00:00
|
|
|
fn bytes_from_str_array(src: Vec<String>) -> Result<Vec<u8>, 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)
|
|
|
|
}
|
|
|
|
})
|
2021-10-09 20:00:49 +00:00
|
|
|
.map(|e| e.map_err(ByteArrayParseErr::from))
|
2021-09-11 18:21:34 +00:00
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn parse_bytes_from_input_arg(src: Vec<String>) -> Result<Vec<u8>, 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)
|
|
|
|
}
|