crw-core 0.13.4

Core types, config, and error handling for the CRW web scraper
Documentation
use crw_core::error::CrwError;

#[test]
fn error_display_all_variants() {
    let cases: Vec<(CrwError, &str)> = vec![
        (
            CrwError::HttpError("conn refused".into()),
            "HTTP request failed: conn refused",
        ),
        (
            CrwError::InvalidRequest("bad url".into()),
            "Invalid request: bad url",
        ),
        (
            CrwError::RendererError("cdp fail".into()),
            "Renderer error: cdp fail",
        ),
        (
            CrwError::ExtractionError("parse fail".into()),
            "Extraction error: parse fail",
        ),
        (
            CrwError::CrawlError("depth exceeded".into()),
            "Crawl error: depth exceeded",
        ),
        (CrwError::Timeout(5000), "Timeout after 5000ms"),
        (
            CrwError::ConfigError("missing key".into()),
            "Config error: missing key",
        ),
        (CrwError::NotFound("page 404".into()), "Not found: page 404"),
        (CrwError::Internal("oops".into()), "oops"),
    ];

    for (error, expected) in cases {
        assert_eq!(error.to_string(), expected, "Failed for variant: {error:?}");
    }
}

#[test]
fn error_from_url_parse_error() {
    let url_err = url::Url::parse("not a url").unwrap_err();
    let crw_err: CrwError = url_err.into();
    let msg = crw_err.to_string();
    assert!(msg.contains("URL parse error"), "got: {msg}");
}

#[test]
fn error_debug_impl() {
    let err = CrwError::HttpError("test".into());
    let debug = format!("{err:?}");
    assert!(debug.contains("HttpError"));
}