dora-core 1.0.0

`dora` goal is to be a low latency, composable, and distributed data flow.
Documentation
use dora_core::descriptor::{Descriptor, DescriptorExt};
use std::path::{Path, PathBuf};

fn case_path(name: &str) -> PathBuf {
    Path::new(env!("CARGO_MANIFEST_DIR"))
        .join("tests/descriptor-validation/cases")
        .join(name)
}

fn read_case(name: &str) -> Descriptor {
    Descriptor::blocking_read(&case_path(name)).expect("test descriptor should parse")
}

fn case_error(name: &str) -> String {
    let descriptor = read_case(name);
    let result = if name.starts_with("invalid-module-") {
        descriptor
            .expand(case_path(name).parent().unwrap())
            .map(|_| ())
    } else {
        descriptor.resolve_aliases_and_set_defaults().map(|_| ())
    };
    format!(
        "{:#}",
        result.expect_err("descriptor case should fail validation")
    )
}

#[test]
fn valid_descriptor_field_cases_resolve() {
    for name in [
        "valid-standard.yml",
        "valid-runtime.yml",
        "valid-operator.yml",
        "valid-ros2-metadata.yml",
    ] {
        read_case(name)
            .resolve_aliases_and_set_defaults()
            .unwrap_or_else(|err| panic!("{name} should resolve: {err:#}"));
    }

    for name in ["valid-module.yml", "valid-module-build.yml"] {
        read_case(name)
            .expand(case_path(name).parent().unwrap())
            .unwrap_or_else(|err| panic!("{name} should expand: {err:#}"));
    }
}

#[test]
fn invalid_descriptor_field_cases_report_rejected_fields() {
    for (name, expected) in [
        ("invalid-standard-params.yml", "params"),
        ("invalid-runtime-outputs.yml", "outputs"),
        ("invalid-operator-outputs.yml", "outputs"),
        ("invalid-ros2-git.yml", "git"),
        ("invalid-module-outputs.yml", "outputs"),
    ] {
        let error = case_error(name);
        assert!(
            error.contains(expected) && error.contains("not allowed"),
            "{name} error did not mention rejected field `{expected}`:\n{error}"
        );
    }
}