lethe 0.2.2

A secure, free, cross-platform and open-source drive wiping utility
pub mod stage;
pub use stage::*;

pub mod mem;

use std::collections::BTreeMap;

#[derive(Debug, Clone)]
pub struct Scheme {
    pub description: String,
    pub stages: Vec<Stage>
}

pub struct SchemeRepo {
    schemes: BTreeMap<&'static str, Scheme>
}

impl SchemeRepo {
    pub fn new(schemes: BTreeMap<&'static str, Scheme>) -> SchemeRepo {
        SchemeRepo { schemes }
    }

    pub fn default() -> SchemeRepo {
        let mut schemes = BTreeMap::new();

        schemes.insert("zero", Scheme {
            description: "Single zeroes fill".to_string(),
            stages: vec!(
                Stage::zero()
            )});

        schemes.insert("random", Scheme { 
            description: "Single random fill".to_string(),
            stages: vec!(
                Stage::random()
            )});
        
        schemes.insert("random2", Scheme {
            description: "Double random fill".to_string(),
            stages: vec!(
                Stage::random(),
                Stage::random()
            )});
        
        schemes.insert("gost", Scheme {
            description: "GOST R 50739-95 (fake)".to_string(),
            stages: vec!(
                Stage::zero(),
                Stage::random()
            )});
        
        schemes.insert("dod", Scheme {
            description: "DoD 5220.22-M / CSEC ITSG-06 / NAVSO P-5239-26".to_string(),
            stages: vec!(
                Stage::zero(),
                Stage::one(),
                Stage::random()
            )});
        
        schemes.insert("vsitr", Scheme {
            description: "VSITR / RCMP TSSIT OPS-II".to_string(),
            stages: vec!(
                Stage::zero(),
                Stage::one(),
                Stage::zero(),
                Stage::one(),
                Stage::zero(),
                Stage::one(),
                Stage::random()
            )});
        
        Self::new(schemes)
    }

    pub fn all(&self) -> &BTreeMap<&'static str, Scheme> {
        &self.schemes
    }

    pub fn find(&self, name: &str) -> Option<&Scheme> {
        self.schemes.get(name)
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_scheme_find() {
        let repo = SchemeRepo::default();

        assert!(repo.find("missing").is_none());

        let scheme = repo.find("random");
        assert!(scheme.is_some());
    }

}