From 62944783caf60a78fa4708f5c55dc345cbb7c83a Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Mon, 16 May 2022 16:46:23 -0400 Subject: [PATCH] some refactoring --- src/math_app.rs | 25 +++++++++++++------------ src/misc.rs | 11 ++++------- tests/misc.rs | 10 ++++++++-- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/math_app.rs b/src/math_app.rs index 1caa5fe..797433f 100644 --- a/src/math_app.rs +++ b/src/math_app.rs @@ -160,13 +160,10 @@ impl MathApp { assume(!cached_data.is_empty()); } - if commit == build::SHORT_COMMIT { + if commit == build::SHORT_COMMIT.chars().map(|c| c as u8).collect::>().as_slice() { tracing::info!("Reading decompression cache. Bytes: {}", cached_data.len()); return Some(cached_data.to_vec()); } else { - tracing::info!("Decompression cache are invalid (build: {}, previous: {})", build::SHORT_COMMIT, commit); - - // is invalid None } } @@ -179,7 +176,8 @@ impl MathApp { } tracing::info!("Setting decompression cache"); - let saved_data = &crate::misc::hashed_storage_create(&build::SHORT_COMMIT.as_bytes(), data); + let commit: [u8; crate::misc::HASH_LENGTH] = unsafe { build::SHORT_COMMIT.as_bytes().try_into().unwrap_unchecked() }; + let saved_data = &crate::misc::hashed_storage_create(commit, data); tracing::info!("Bytes: {}", saved_data.len()); get_localstorage().set_item(DATA_NAME, saved_data).expect("failed to set local storage cache"); } @@ -200,13 +198,11 @@ impl MathApp { assume(!func_data.is_empty()); } - if commit == build::SHORT_COMMIT { + if commit == build::SHORT_COMMIT.chars().map(|c| c as u8).collect::>().as_slice() { tracing::info!("Reading previous function data"); let function_manager: FunctionManager = bincode::deserialize(&func_data).ok()?; return Some(function_manager); } else { - tracing::info!("Previous functions are invalid due to differing commits (build: {}, previous: {})", build::SHORT_COMMIT, commit); - // is invalid None } } @@ -619,10 +615,15 @@ impl App for MathApp { { tracing::info!("Setting current functions"); let saved_data = &crate::misc::hashed_storage_create( - &build::SHORT_COMMIT - .chars() - .map(|c| c as u8) - .collect::>(), + unsafe { + build::SHORT_COMMIT + .chars() + .map(|c| c as u8) + .collect::>() + .as_slice() + .try_into() + .unwrap_unchecked() + }, bincode::serialize(&self.functions).unwrap().as_slice(), ); // tracing::info!("Bytes: {}", saved_data.len()); diff --git a/src/misc.rs b/src/misc.rs index ed52d19..9003d29 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -311,18 +311,15 @@ pub fn almost_variable(x: f64) -> Option { pub const HASH_LENGTH: usize = 8; #[allow(dead_code)] -pub fn hashed_storage_create(hash: &[u8], data: &[u8]) -> String { - debug_assert_eq!(hash.len(), HASH_LENGTH); +pub fn hashed_storage_create(hash: [u8; HASH_LENGTH], data: &[u8]) -> String { debug_assert!(!data.is_empty()); unsafe { assume(!data.is_empty()); - assume(hash.len() == HASH_LENGTH); - assume(!hash.is_empty()); } // cannot use `from_utf8` seems to break on wasm. no clue why - [hash, data] + [&hash, data] .concat() .iter() .map(|b| *b as char) @@ -330,7 +327,7 @@ pub fn hashed_storage_create(hash: &[u8], data: &[u8]) -> String { } #[allow(dead_code)] -pub fn hashed_storage_read(data: String) -> (String, Vec) { +pub fn hashed_storage_read(data: String) -> ([u8; HASH_LENGTH], Vec) { debug_assert!(data.len() > HASH_LENGTH); unsafe { assume(!data.is_empty()); @@ -351,7 +348,7 @@ pub fn hashed_storage_read(data: String) -> (String, Vec) { } ( - hash.iter().map(|c| *c as char).collect::(), + unsafe { hash.try_into().unwrap_unchecked() }, cached_data.to_vec(), ) } diff --git a/tests/misc.rs b/tests/misc.rs index 325d5d5..255c96e 100644 --- a/tests/misc.rs +++ b/tests/misc.rs @@ -97,9 +97,15 @@ fn hashed_storage() { .chars() .map(|c| c as u8) .collect::>(); - let storage = hashed_storage_create(commit.as_slice(), data.as_slice()); + let storage = hashed_storage_create( + commit + .as_slice() + .try_into() + .expect("cannot turn into [u8; 8]"), + data.as_slice(), + ); let read = hashed_storage_read(storage); - assert_eq!(read.0.chars().map(|c| c as u8).collect::>(), commit); + assert_eq!(read.0.to_vec(), commit); assert_eq!(read.1, data); }