use crate::{
Exceptions,
common::{BitArray, Result},
};
pub fn buildBitArrayFromString(data: &str) -> Result<BitArray> {
let dotsAndXs = data.replace("1", "X").replace("0", ".");
let mut binary = BitArray::with_size(dotsAndXs.replace(" ", "").len());
let mut counter = 0;
for (i, ch) in dotsAndXs.chars().enumerate() {
if i % 9 == 0 {
if ch != ' ' {
return Err(Exceptions::illegal_state_with("space expected"));
}
continue;
}
if ch == 'X' || ch == 'x' {
binary.set(counter);
}
counter += 1;
}
Ok(binary)
}
pub fn buildBitArrayFromStringWithoutSpaces(data: &str) -> Result<BitArray> {
let mut sb = String::new();
let dotsAndXs = data.replace("1", "X").replace("0", ".");
let mut current = 0;
let dotsAndXs_length = dotsAndXs.len();
let dotsAndXs_bytes = dotsAndXs.as_bytes();
while current < dotsAndXs_length {
sb.push(' ');
let mut i = 0;
while i < 8 && current < dotsAndXs_length {
sb.push(dotsAndXs_bytes[current] as char);
current += 1;
i += 1;
}
}
buildBitArrayFromString(&sb)
}
#[cfg(test)]
mod BinaryUtilTest {
#[test]
fn testBuildBitArrayFromString() {
let data = " ..X..X.. ..XXX... XXXXXXXX ........";
check(data);
let data = " XXX..X..";
check(data);
let data = " XX";
check(data);
let data = " ....XX.. ..XX";
check(data);
let data = " ....XX.. ..XX..XX ....X.X. ........";
check(data);
}
fn check(data: &str) {
let binary = super::buildBitArrayFromString(data).expect("check");
assert_eq!(data, binary.to_string());
}
#[test]
fn testBuildBitArrayFromStringWithoutSpaces() {
let data = " ..X..X.. ..XXX... XXXXXXXX ........";
checkWithoutSpaces(data);
let data = " XXX..X..";
checkWithoutSpaces(data);
let data = " XX";
checkWithoutSpaces(data);
let data = " ....XX.. ..XX";
checkWithoutSpaces(data);
let data = " ....XX.. ..XX..XX ....X.X. ........";
checkWithoutSpaces(data);
}
fn checkWithoutSpaces(data: &str) {
let dataWithoutSpaces = data.replace(" ", ""); let binary =
super::buildBitArrayFromStringWithoutSpaces(&dataWithoutSpaces).expect("success");
assert_eq!(data, binary.to_string());
}
}