sview 0.1.0

Agent-friendly structure views of source and document files
Documentation
use assert_cmd::prelude::*;
use predicates::prelude::*;
use std::{fs, process::Command};
use tempfile::tempdir;

#[test]
fn emits_json_for_a_file() {
    let dir = tempdir().unwrap();
    let path = dir.path().join("sample.txt");
    fs::write(&path, "hello\n").unwrap();

    Command::cargo_bin("sview")
        .unwrap()
        .args([path.to_str().unwrap(), "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"language\": \"unknown\""))
        .stdout(predicate::str::contains("\"kind\": \"file\""));
}

#[test]
fn emits_text_by_default() {
    let dir = tempdir().unwrap();
    let path = dir.path().join("README.md");
    fs::write(&path, "# Title\n").unwrap();

    Command::cargo_bin("sview")
        .unwrap()
        .arg(path.to_str().unwrap())
        .assert()
        .success()
        .stdout(predicate::str::contains("README.md (markdown)"))
        .stdout(predicate::str::contains("└─ heading Title L1-1"));
}

#[test]
fn emits_text_for_multiple_files() {
    let dir = tempdir().unwrap();
    let readme = dir.path().join("README.md");
    let lib = dir.path().join("lib.rs");
    fs::write(&readme, "# Title\n").unwrap();
    fs::write(&lib, "pub struct Client;\n").unwrap();

    Command::cargo_bin("sview")
        .unwrap()
        .args([readme.to_str().unwrap(), lib.to_str().unwrap()])
        .assert()
        .success()
        .stdout(predicate::str::contains("README.md (markdown)"))
        .stdout(predicate::str::contains("lib.rs (rust)"))
        .stdout(predicate::str::contains("└─ struct Client L1-1"));
}

#[test]
fn emits_json_array_for_multiple_files() {
    let dir = tempdir().unwrap();
    let readme = dir.path().join("README.md");
    let lib = dir.path().join("lib.rs");
    fs::write(&readme, "# Title\n").unwrap();
    fs::write(&lib, "pub struct Client;\n").unwrap();

    Command::cargo_bin("sview")
        .unwrap()
        .args([readme.to_str().unwrap(), lib.to_str().unwrap(), "--json"])
        .assert()
        .success()
        .stdout(predicate::str::starts_with("["))
        .stdout(predicate::str::contains("\"language\": \"markdown\""))
        .stdout(predicate::str::contains("\"language\": \"rust\""));
}

#[test]
fn emits_text_for_typescript() {
    let dir = tempdir().unwrap();
    let path = dir.path().join("app.ts");
    fs::write(
        &path,
        "export interface User { id: string }\nexport function loadUser(): User { return { id: '1' }; }\n",
    )
    .unwrap();

    Command::cargo_bin("sview")
        .unwrap()
        .arg(path.to_str().unwrap())
        .assert()
        .success()
        .stdout(predicate::str::contains("app.ts (typescript)"))
        .stdout(predicate::str::contains("├─ interface User L1-1"))
        .stdout(predicate::str::contains("└─ function loadUser L2-2"));
}