#![warn(clippy::all, clippy::pedantic)]
pub mod deck;
pub mod error;
pub mod format;
use crate::deck::Deck;
use crate::error::DeckCodeError;
use base64::prelude::*;
use integer_encoding::VarInt;
pub fn decode_deck_code(deck_code: &str) -> Result<Deck, DeckCodeError> {
let decoded: Vec<u32> = decode_code_to_u32_vec(deck_code)?;
Deck::new(&decoded)
}
#[must_use]
pub fn encode_deck_code(deck: &Deck) -> String {
encode_u32_vec_to_deck_code(deck.to_byte_array())
}
fn decode_code_to_u32_vec(deck_code: &str) -> Result<Vec<u32>, DeckCodeError> {
let mut decoded = BASE64_STANDARD.decode(deck_code)?;
let mut deck_code_decoded: Vec<u32> = vec![];
while !decoded.is_empty() {
let (read, size) = u32::decode_var(&decoded).ok_or(DeckCodeError::Unknown)?;
deck_code_decoded.push(read);
decoded = decoded[size..].to_vec();
}
Ok(deck_code_decoded)
}
#[allow(clippy::needless_range_loop)]
fn encode_u32_vec_to_deck_code(byte_array: Vec<u32>) -> String {
let mut fixed_size_integers: Vec<u8> = Vec::new();
let mut encoded: [u8; 4] = [0, 0, 0, 0]; for i in byte_array {
let encoded_bytes = i.encode_var(&mut encoded[..]);
for encoded_index in 0..encoded_bytes {
fixed_size_integers.push(encoded[encoded_index]);
}
}
BASE64_STANDARD.encode(&fixed_size_integers)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decode_code_to_u32_vec_correctly_decodes_a_simple_code() {
let result = decode_code_to_u32_vec("AAEBAQcAAAQBAwIDAwMEAw==");
let expected = vec![
0, 1, 1, 1, 7, 0, 0, 4, 1, 3, 2, 3, 3, 3, 4, 3, ];
assert!(result.is_ok());
assert_eq!(result.unwrap(), expected);
}
#[test]
fn encode_simple_byte_array_as_deck_code() {
let input = vec![
0, 1, 1, 1, 7, 0, 0, 4, 1, 3, 2, 3, 3, 3, 4, 3, ];
let expected = "AAEBAQcAAAQBAwIDAwMEAw==";
let result = encode_u32_vec_to_deck_code(input);
assert_eq!(result, expected);
}
#[test]
fn decode_code_to_u8_vec_correctly_decodes_a_complex_code() {
let result = decode_code_to_u32_vec(
"AAECAf0EBMABobcC3s0Cps4CDXHDAbsClQOrBJYF7AWjtgLXtgLpugKHvQLBwQKYxAIA",
);
let expected = vec![
0, 1, 2, 1, 637, 4, 192, 39841, 42718, 42790, 13, 113, 195, 315, 405, 555, 662, 748, 39715, 39767, 40297, 40583, 41153, 41496, 0, ];
assert!(result.is_ok());
assert_eq!(result.unwrap(), expected);
}
#[test]
fn encode_complex_byte_array_as_deck_code() {
let input = vec![
0, 1, 2, 1, 637, 4, 192, 39841, 42718, 42790, 13, 113, 195, 315, 405, 555, 662, 748, 39715, 39767, 40297, 40583, 41153, 41496, 0, ];
let expected = "AAECAf0EBMABobcC3s0Cps4CDXHDAbsClQOrBJYF7AWjtgLXtgLpugKHvQLBwQKYxAIA";
assert_eq!(encode_u32_vec_to_deck_code(input), expected);
}
}