use anyhow::{anyhow, Result};
use rucksack_lib::util;
use super::shared;
pub use super::v040::{Creds, DecryptedRecord, EncryptedRecord, Kind, Metadata};
pub const VERSION: &str = "0.5.0";
pub type HashMap = dashmap::DashMap<String, EncryptedRecord>;
pub fn decode_hashmap(bytes: Vec<u8>, mut version: versions::SemVer) -> Result<HashMap> {
log::debug!(
"Decoding hashmap from stored bytes (format version {:})...",
version
);
version = shared::trim_version(version);
let hm: HashMap = dashmap::DashMap::new();
log::trace!("Created hashmap.");
let sorted_vec: Vec<(String, EncryptedRecord)>;
log::trace!("Created vec for sorted data.");
if version < shared::version(VERSION) {
let msg = format!("automatic migration not supported for versions prior to: {VERSION}");
log::error!("{}", msg);
return Err(anyhow!(msg));
}
match bincode::decode_from_slice(bytes.as_ref(), util::bincode_cfg()) {
Ok((result, _len)) => {
sorted_vec = result;
for (key, val) in sorted_vec {
if hm.insert(key.clone(), val).is_some() {}
}
Ok(hm)
}
Err(e) => {
let msg = format!("couldn't deserialise bincoded hashmap bytes: {e:?}");
log::error!("{}", msg);
Err(anyhow!(msg))
}
}
}