emerald-vault 0.36.0

Emerald Vault - Key Storage for Emerald Wallet
Documentation
use std::path::Path;
use std::str::FromStr;
use uuid::Uuid;
use regex::Regex;

pub(crate) fn try_vault_file(file: &Path, suffix: &str) -> Result<Uuid, ()> {
    lazy_static! {
        static ref RE: Regex = Regex::new(r"(?P<id>[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12})\.(?P<suffix>[a-z]+)").unwrap();
    }

    match file.file_name() {
        Some(name) => {
            let file_name = name.to_str().unwrap();
            match RE.captures(file_name) {
                Some(caps) => {
                    let act_suffix = caps.name("suffix").unwrap().as_str();
                    if act_suffix.eq(suffix) {
                        let id: &str = caps.name("id").unwrap().as_str();
                        let uuid = Uuid::from_str(id).unwrap();
                        if format!("{}.{}", &uuid, suffix).eq(file_name) {
                            Ok(uuid)
                        } else {
                            Err(())
                        }
                    } else {
                        Err(())
                    }
                }
                None => Err(()),
            }
        }
        None => Err(()),
    }
}

#[cfg(test)]
mod tests {
    use std::str::FromStr;
    use super::*;

    #[test]
    fn try_vault_file_from_standard() {
        let act = try_vault_file(Path::new("3221aabc-b3ff-4235-829f-9599aba04cb5.key"), "key");
        assert!(act.is_ok());
        assert_eq!(
            Uuid::from_str("3221aabc-b3ff-4235-829f-9599aba04cb5").unwrap(),
            act.unwrap()
        );
    }

    #[test]
    fn try_vault_file_from_invalid_suffix() {
        let act = try_vault_file(
            Path::new("3221aabc-b3ff-4235-829f-9599aba04cb5.seed"),
            "key",
        );
        assert!(act.is_err());
    }

    #[test]
    fn try_vault_file_from_invalid_name() {
        let act = try_vault_file(Path::new("9599aba04cb5.key"), "key");
        assert!(act.is_err());
        let act = try_vault_file(
            Path::new("3221aabc-b3ff-4235-829f-9599aba04cb5.key.bak"),
            "key",
        );
        assert!(act.is_err());
        let act = try_vault_file(
            Path::new("~3221aabc-b3ff-4235-829f-9599aba04cb5.key"),
            "key",
        );
        assert!(act.is_err());
        let act = try_vault_file(
            Path::new("3221aabc-b3ff-4235-829f-9599aba04cb5.~key"),
            "key",
        );
        assert!(act.is_err());
        let act = try_vault_file(
            Path::new("3221aabc-b3ff-4235-829f-9599aba04cb5.key~"),
            "key",
        );
        assert!(act.is_err());
    }
}