use crate::neo_wallets::{Wallet, WalletError};
use std::{fs::File, io::Write, path::PathBuf};
pub struct WalletBackup;
impl WalletBackup {
pub fn backup(wallet: &Wallet, path: PathBuf) -> Result<(), WalletError> {
let nep6 = wallet.to_nep6()?;
let json = serde_json::to_string_pretty(&nep6)
.map_err(|e| WalletError::AccountState(format!("Serialization error: {e}")))?;
let mut file = File::create(path).map_err(WalletError::IoError)?;
file.write_all(json.as_bytes()).map_err(WalletError::IoError)?;
Ok(())
}
pub fn recover(path: PathBuf) -> Result<Wallet, WalletError> {
let file_content = std::fs::read_to_string(path).map_err(WalletError::IoError)?;
let nep6_wallet = serde_json::from_str(&file_content)
.map_err(|e| WalletError::AccountState(format!("Deserialization error: {e}")))?;
Wallet::from_nep6(nep6_wallet)
}
}
#[cfg(test)]
mod tests {
use std::fs;
use crate::{
neo_protocol::{Account, AccountTrait},
neo_wallets::{Wallet, WalletBackup, WalletTrait},
};
#[test]
fn test_backup_and_recover() {
let mut wallet = Wallet::new();
let account = Account::create().expect("Should be able to create account in test");
wallet.add_account(account);
wallet.encrypt_accounts("test_password");
let temp_file = tempfile::NamedTempFile::new()
.expect("Should be able to create temporary file in test");
let backup_path = temp_file.path().with_extension("json");
WalletBackup::backup(&wallet, backup_path.clone())
.expect("Should be able to backup wallet in test");
assert!(backup_path.exists());
let recovered_wallet = WalletBackup::recover(backup_path.clone())
.expect("Should be able to recover wallet in test");
assert_eq!(wallet.name(), recovered_wallet.name());
assert_eq!(wallet.version(), recovered_wallet.version());
assert_eq!(wallet.accounts().len(), recovered_wallet.accounts().len());
fs::remove_file(backup_path).expect("Should be able to remove backup file in test");
}
}