typst-pack 0.5.0

Portable single-file packs of Typst projects: sources, resources, packages, and fonts
Documentation
use typst::syntax::package::{PackageSpec, PackageVersion};
use typst_pack::{PackageReadFailure, PackageReadFailureReason, PackageReadFailures};

#[test]
fn package_read_failure_preserves_the_exact_specification_and_typed_reason() {
    let spec: PackageSpec = "@preview/example:1.0.0".parse().unwrap();
    let latest: PackageVersion = "1.1.0".parse().unwrap();
    let failure = PackageReadFailure::new(
        spec.clone(),
        PackageReadFailureReason::VersionNotFound { latest },
    );

    assert_eq!(failure.spec(), &spec);
    assert_eq!(
        failure.reason(),
        &PackageReadFailureReason::VersionNotFound { latest }
    );
}

#[test]
fn package_read_failures_are_keyed_in_canonical_specification_order() {
    let alpha: PackageSpec = "@preview/alpha:1.0.0".parse().unwrap();
    let zeta: PackageSpec = "@preview/zeta:1.0.0".parse().unwrap();
    let mut failures = PackageReadFailures::new();

    failures.insert(PackageReadFailure::new(
        zeta.clone(),
        PackageReadFailureReason::NotFound,
    ));
    failures.insert(PackageReadFailure::new(
        alpha.clone(),
        PackageReadFailureReason::NetworkFailed { detail: None },
    ));

    assert_eq!(
        failures
            .entries()
            .map(|failure| failure.spec().to_string())
            .collect::<Vec<_>>(),
        ["@preview/alpha:1.0.0", "@preview/zeta:1.0.0"]
    );
    assert_eq!(
        failures.get(&alpha).unwrap().reason(),
        &PackageReadFailureReason::NetworkFailed { detail: None }
    );
}