pub mod descriptors;
pub mod types;
pub const PROTOCOL_BASE: &str = "https://firstperson.network/protocols/backup-management/1.0";
pub const EXPORT_BACKUP: &str =
"https://firstperson.network/protocols/backup-management/1.0/export";
pub const EXPORT_BACKUP_RESULT: &str =
"https://firstperson.network/protocols/backup-management/1.0/export-result";
pub const IMPORT_BACKUP: &str =
"https://firstperson.network/protocols/backup-management/1.0/import";
pub const IMPORT_BACKUP_RESULT: &str =
"https://firstperson.network/protocols/backup-management/1.0/import-result";
pub const MIN_BACKUP_PASSWORD_LEN: usize = 15;
pub fn validate_backup_password(password: &str) -> Result<(), String> {
if password.chars().count() < MIN_BACKUP_PASSWORD_LEN {
return Err(format!(
"backup password must be at least {MIN_BACKUP_PASSWORD_LEN} characters"
));
}
Ok(())
}
#[cfg(test)]
mod password_tests {
use super::*;
#[test]
fn rejects_below_minimum_and_accepts_the_boundary() {
let err = validate_backup_password("14-char-passwo").expect_err("14 chars must be short");
assert!(
err.contains("15 characters"),
"error must name the minimum, got: {err}"
);
validate_backup_password("15-char-passwor").expect("15 chars is the minimum");
}
#[test]
fn counts_characters_not_bytes() {
let ten_chars = "паролькмоя";
assert_eq!(ten_chars.chars().count(), 10);
assert!(ten_chars.len() >= MIN_BACKUP_PASSWORD_LEN);
assert!(validate_backup_password(ten_chars).is_err());
}
}