tree-type 0.4.5

Rust macros for creating type-safe filesystem tree structures
Documentation
#![allow(deprecated)]
use assert2::assert;
use assert2::check;
use assert2::let_assert;
use tempfile::TempDir;
use tree_type::CreateDefaultOutcome;
use tree_type::tree_type;

#[allow(dead_code)]
fn default_config(file: &ProjectRootConfig) -> Result<String, std::io::Error> {
    Ok(format!("# Config for {}\n", file.as_path().display()))
}

tree_type! {
    ProjectRoot {
        #[default(default_config)]
        config("config.toml"),
    }
}

#[test]
fn test_create_default_creates_file() {
    let_assert!(Ok(tempdir) = TempDir::new());
    let project = ProjectRoot::new(tempdir.path()).unwrap();
    let config = project.config();

    check!(!config.exists());

    let_assert!(Ok(outcome) = config.create_default::<std::io::Error>());
    assert!(outcome == CreateDefaultOutcome::Created);

    check!(config.exists());
    let_assert!(Ok(content) = config.read_to_string());
    assert!(content.starts_with("# Config for"));
}

#[test]
fn test_create_default_already_exists() {
    let_assert!(Ok(tempdir) = TempDir::new());
    let project = ProjectRoot::new(tempdir.path()).unwrap();
    let config = project.config();

    let_assert!(Ok(()) = config.write("existing content"));
    check!(config.exists());

    let_assert!(Ok(outcome) = config.create_default::<std::io::Error>());
    assert!(outcome == CreateDefaultOutcome::AlreadyExists);

    let_assert!(Ok(content) = config.read_to_string());
    assert!(content == "existing content");
}