annotui 0.1.0

Mouse-first terminal UI for commenting on files and piped text.
Documentation
use std::{fs, path::Path};

#[test]
fn domain_and_source_are_terminal_and_io_independent() {
    assert_forbidden(
        &["src/domain.rs", "src/source.rs"],
        &[
            "crate::app",
            "crate::render",
            "crate::runner",
            "crate::terminal",
            "crossterm",
            "ratatui",
            "std::fs",
            "std::process",
        ],
    );
}

#[test]
fn output_does_not_depend_on_terminal_layers() {
    assert_forbidden(
        &["src/output.rs"],
        &[
            "crate::app",
            "crate::render",
            "crate::terminal",
            "crossterm",
            "ratatui",
        ],
    );
}

#[test]
fn input_hit_testing_stays_adapter_free() {
    assert_forbidden(
        &["src/input.rs"],
        &["crate::runner", "crate::terminal", "crossterm", "std::fs"],
    );
}

fn assert_forbidden(files: &[&str], forbidden: &[&str]) {
    let source = files
        .iter()
        .map(|file| {
            assert!(
                Path::new(file).exists(),
                "missing architecture input {file}"
            );
            fs::read_to_string(file).expect("read architecture input")
        })
        .collect::<Vec<_>>()
        .join("\n");
    for needle in forbidden {
        assert!(
            !source.contains(needle),
            "architecture contains forbidden dependency `{needle}`"
        );
    }
}