docparser-sdk 0.1.0

docparser 一体化入口:一次依赖拿到 core + PDF + Office 后端,输出统一 IR
Documentation
//! 按需引用(feature 裁剪)的行为验证:
//! 被裁掉的格式必须**明确报错**(`unsupported`),不能静默成功、也不能 panic。
//!
//! 这些用例只在对应最小组合下才编译:`cargo test -p docparser-sdk --no-default-features --features csv` 等。

// 默认特性(全开)下所有裁剪用例都不编译,helper 会被判 dead_code
#[allow(dead_code)]
fn write_tmp(name: &str, content: &[u8]) -> std::path::PathBuf {
    let dir = std::env::temp_dir().join("docparser_sdk_features_test");
    std::fs::create_dir_all(&dir).unwrap();
    let p = dir.join(name);
    std::fs::write(&p, content).unwrap();
    p
}

/// 只用 txt(任何 feature 都没开):txt 是底座,恒可用。
#[cfg(not(any(feature = "md", feature = "csv", feature = "html")))]
#[test]
fn bare_kernel_still_parses_txt() {
    let p = write_tmp("bare.txt", b"a\n\nb\n");
    let doc = docparser_sdk::parse(p.to_str().unwrap()).unwrap();
    std::fs::remove_file(&p).ok();
    assert_eq!(doc.meta.file_type, "txt");
    assert_eq!(doc.pages[0].blocks.len(), 2);
}

/// 关掉 md 后:`.md` 不能假装解析成功。
#[cfg(all(feature = "csv", not(feature = "md")))]
#[test]
fn disabled_markdown_reports_unsupported() {
    let p = write_tmp("off.md", b"# t\n");
    let err = docparser_sdk::parse(p.to_str().unwrap()).unwrap_err();
    std::fs::remove_file(&p).ok();
    assert_eq!(err.code.as_str(), "unsupported");
}

/// 开着 csv:同进程里 csv 正常,md 仍然 unsupported(互不影响)。
#[cfg(all(feature = "csv", not(feature = "md")))]
#[test]
fn enabled_csv_still_works() {
    let p = write_tmp("on.csv", b"h1,h2\n\"a,1\",2\n");
    let doc = docparser_sdk::parse(p.to_str().unwrap()).unwrap();
    std::fs::remove_file(&p).ok();
    assert_eq!(doc.meta.file_type, "csv");
    assert_eq!(
        doc.pages[0].blocks[0].table.as_ref().unwrap().rows[1],
        vec!["a,1", "2"]
    );
}

/// 只开 docx:office 侧只暴露一种格式。
#[cfg(all(feature = "docx", not(any(feature = "xlsx", feature = "pptx"))))]
#[test]
fn office_formats_follow_features() {
    assert_eq!(docparser_sdk::office::FORMATS, &["docx"]);
}

/// 只开 docx:xlsx 与 pptx 必须 unsupported(文件头给 ZIP magic,避免被嗅探成纯文本)。
#[cfg(all(feature = "docx", not(any(feature = "xlsx", feature = "pptx"))))]
#[test]
fn disabled_office_formats_report_unsupported() {
    for name in ["off.xlsx", "off.pptx"] {
        let p = write_tmp(name, b"PK\x03\x04");
        let err = docparser_sdk::parse(p.to_str().unwrap()).unwrap_err();
        std::fs::remove_file(&p).ok();
        assert_eq!(err.code.as_str(), "unsupported", "{name} 应报 unsupported");
    }
}