use crate::file::write_all_atomic;
use crate::types::{EncFileError, EncryptOptions, KeyMap};
use secrecy::SecretString;
use std::fs::File;
use std::io::Read;
use std::path::Path;
use zeroize::Zeroize;
pub fn load_keymap(path: &Path, password: SecretString) -> Result<KeyMap, EncFileError> {
let mut data = Vec::new();
File::open(path)?.read_to_end(&mut data)?;
let mut pt = crate::decrypt_bytes(&data, password)?;
let map: KeyMap = ciborium::de::from_reader(pt.as_slice())?;
pt.zeroize();
Ok(map)
}
pub fn save_keymap(
path: &Path,
password: SecretString,
map: &KeyMap,
opts: &EncryptOptions,
) -> Result<(), EncFileError> {
let mut pt = Vec::new();
ciborium::ser::into_writer(map, &mut pt)?;
let bytes = if opts.stream {
return Err(EncFileError::Invalid("keymap: streaming not supported"));
} else {
crate::encrypt_bytes(&pt, password, opts)?
};
pt.zeroize();
write_all_atomic(path, &bytes, true)?;
Ok(())
}