turtle-build 0.2.1

The Ninja build system clone written in Rust
use crate::ast::Module;
use std::{cell::RefCell, collections::HashMap, path::PathBuf};

pub type ModuleDependencyMap = HashMap<PathBuf, HashMap<String, PathBuf>>;

#[derive(Debug, Default)]
pub struct Context {
    modules: HashMap<PathBuf, Module>,
    dependencies: ModuleDependencyMap,
    build_index: RefCell<usize>,
}

impl Context {
    pub fn new(modules: HashMap<PathBuf, Module>, dependencies: ModuleDependencyMap) -> Self {
        Self {
            modules,
            dependencies,
            build_index: RefCell::new(0),
        }
    }

    pub fn modules(&self) -> &HashMap<PathBuf, Module> {
        &self.modules
    }

    pub fn dependencies(&self) -> &ModuleDependencyMap {
        &self.dependencies
    }

    pub fn generate_build_id(&self) -> String {
        let index = *self.build_index.borrow();

        *self.build_index.borrow_mut() += 1;

        index.to_string()
    }
}

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

    #[test]
    fn generate_build_ids() {
        let context = Context::new(Default::default(), Default::default());

        assert_eq!(context.generate_build_id(), "0".to_string());
        assert_eq!(context.generate_build_id(), "1".to_string());
        assert_eq!(context.generate_build_id(), "2".to_string());
    }
}