use super::generic::{GenericDiagram, GenericResult};
use bitcoin::hashes::{sha256, Hash};
#[derive(Debug, Clone, PartialEq)]
pub struct AnimateDiagram(pub Vec<[[Option<char>; 7]; 7]>);
impl GenericDiagram<7, 7> for AnimateDiagram {
type Item = char;
fn to_bytes(&self) -> GenericResult<Vec<u8>> {
let mut chars = Vec::new();
let mut frames = Vec::new();
self.0.iter().rev().for_each(|mx| {
let mut indices = [0_u8; 7];
(0..7).rev().for_each(|col| {
(0..7).rev().for_each(|row| {
if let Some(ch) = mx[row][col] {
chars.push(ch);
indices[row] |= 1 << (6 - col);
}
});
});
indices[1] |= 1 << 7; frames.push(indices);
});
frames[0][0] |= 1 << 7;
let str = chars.into_iter().collect::<String>();
let mut secret = [str.as_bytes(), &frames.concat()].concat();
let check = sha256::Hash::hash(&secret).as_byte_array()[0];
secret.push(check);
Ok(secret)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_animate() -> GenericResult<()> {
let mut cube = vec![[[None; 7]; 7], [[Some('X'); 7]; 7], [[None; 7]; 7]];
cube[0][3][3] = Some('X');
cube[2][6][6] = Some('X');
let diagram = AnimateDiagram(cube);
let bytes = diagram.to_bytes()?;
assert_eq!(
&bytes[51..],
[
128, 128, 0, 0, 0, 0, 1, 127, 255, 127, 127, 127, 127, 127, 0, 128, 0, 8, 0, 0, 0, 24, ]
);
let master = diagram.bip32_master("123456".as_bytes())?;
#[cfg(not(feature = "testnet"))]
const MASTER: &str = "xprv9s21ZrQH143K3LZCYpVpieDdNgMkymbiawMFUAPysrTJJrkrVCpaFtEUXBpr32nVVeHjPtqRCqih7ptuiu5A34VHPPPZMZfqisJyV6jhCwU";
#[cfg(feature = "testnet")]
const MASTER: &str = "tprv8ZgxMBicQKsPe9njDPMKtHqcgomyDHdivVGNLapSMpwn6TVwUaAKmdbvSMzW3QAos5pWPzTBNCJVagSer7R6r7ksv2bs1vPtdy4Pvr2uKuZ";
assert_eq!(master.to_string(), MASTER);
Ok(())
}
}