scraps 3.5.0

Scraps is a portable CLI knowledge hub for managing interconnected Markdown documentation with Wiki-link notation.
use crate::constants::CONFIG_FILE_NAME;
use crate::error::{InitError, ScrapsResult, anyhow::Context};
use std::{fs, path::Path};

pub struct InitUsecase;

impl InitUsecase {
    pub fn new() -> InitUsecase {
        InitUsecase
    }

    pub fn execute(&self, project_dir: &Path) -> ScrapsResult<()> {
        let config_toml_file = project_dir.join(CONFIG_FILE_NAME);
        fs::write(&config_toml_file, include_str!("builtins/.scraps.toml"))
            .context(InitError::WriteFailure(config_toml_file))?;

        let gitignore_file = project_dir.join(".gitignore");
        fs::write(&gitignore_file, "_site\n").context(InitError::WriteFailure(gitignore_file))
    }
}

impl Default for InitUsecase {
    fn default() -> Self {
        Self::new()
    }
}

#[cfg(test)]
mod tests {
    use crate::test_fixtures::{SimpleTempDir, simple_temp_dir};
    use rstest::rstest;

    use super::*;

    #[rstest]
    fn it_writes_config_and_gitignore(#[from(simple_temp_dir)] temp_dir: SimpleTempDir) {
        let usecase = InitUsecase::new();

        usecase.execute(&temp_dir.path).unwrap();

        let config_path = temp_dir.path.join(CONFIG_FILE_NAME);
        assert!(config_path.exists());
        let config_contents = std::fs::read_to_string(&config_path).unwrap();
        assert!(config_contents.contains("[ssg]"));

        let gitignore_path = temp_dir.path.join(".gitignore");
        assert!(gitignore_path.exists());
        let gitignore_contents = std::fs::read_to_string(&gitignore_path).unwrap();
        assert_eq!(gitignore_contents, "_site\n");

        assert!(!temp_dir.path.join("scraps").exists());
        assert!(!temp_dir.path.join(".git").exists());
    }
}