nestum 0.3.2

Proc-macro for nested enum paths like Enum1::Variant1::VariantA
Documentation
use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};

fn unique_temp_dir(label: &str) -> PathBuf {
    let nanos = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .expect("system time should be after unix epoch")
        .as_nanos();
    std::env::temp_dir().join(format!("nestum_{label}_{nanos}"))
}

fn write_file(path: &Path, contents: &str) {
    if let Some(parent) = path.parent() {
        fs::create_dir_all(parent).expect("parent directory should be created");
    }
    fs::write(path, contents).expect("fixture file should be writable");
}

#[test]
fn rustdoc_hides_backing_names_from_downstream_surface() {
    let crate_dir = unique_temp_dir("rustdoc_surface");
    let target_dir = crate_dir.join("target");
    let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));

    write_file(
        &crate_dir.join("Cargo.toml"),
        &format!(
            r#"[package]
name = "nestum_doc_consumer"
version = "0.1.0"
edition = "2024"

[dependencies]
nestum = {{ path = "{}" }}
"#,
            manifest_dir.display()
        ),
    );

    write_file(
        &crate_dir.join("src/lib.rs"),
        r#"use nestum::nestum;

#[nestum]
pub enum DocumentEvent {
    Created,
    Deleted,
}

#[nestum]
pub enum Event {
    Document(DocumentEvent),
    Health,
}

pub fn build() -> Event::Enum {
    Event::Document::Created
}
"#,
    );

    let output = Command::new("cargo")
        .arg("doc")
        .arg("--quiet")
        .arg("--no-deps")
        .arg("--target-dir")
        .arg(&target_dir)
        .current_dir(&crate_dir)
        .output()
        .expect("cargo doc should run");

    if !output.status.success() {
        panic!(
            "cargo doc failed\nstdout:\n{}\nstderr:\n{}",
            String::from_utf8_lossy(&output.stdout),
            String::from_utf8_lossy(&output.stderr)
        );
    }

    let crate_index = fs::read_to_string(target_dir.join("doc/nestum_doc_consumer/index.html"))
        .expect("crate index exists");
    let all_items = fs::read_to_string(target_dir.join("doc/nestum_doc_consumer/all.html"))
        .expect("all items page exists");
    let event_page =
        fs::read_to_string(target_dir.join("doc/nestum_doc_consumer/Event/index.html"))
            .expect("event module page exists");

    assert!(crate_index.contains("DocumentEvent"));
    assert!(!crate_index.contains("__NestumEvent"));
    assert!(crate_index.contains("Event"));
    assert!(all_items.contains("Event::Enum"));
    assert!(all_items.contains("Event::Document::Created"));
    assert!(all_items.contains("Event::Health"));
    assert!(!all_items.contains("__NestumEvent"));
    assert!(!all_items.contains("__NestumDocumentEvent"));
    assert!(!event_page.contains("pub use self::__NestumEvent::Health;"));
    assert!(event_page.contains("constant.Health.html"));

    let _ = fs::remove_dir_all(&crate_dir);
}