runmat-execution 0.6.2

Portable identities, handles, resource models, value payloads, and protocol contracts for RunMat execution
Documentation
use runmat_execution::identity::TaskId;
use runmat_execution::protocol::{Envelope, ProtocolLimits, ProtocolVersion};
use runmat_execution::{Digest, DomainContribution, ProgramEnvironment, ProgramRevision};
use serde::Deserialize;

#[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::wasm_bindgen_test;

#[derive(Deserialize)]
struct Fixture {
    schema: String,
    program_revision_cbor_hex: String,
    program_revision_identity: String,
    envelope_cbor_hex: String,
    task_id: String,
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), test)]
fn native_and_wasm_match_the_shared_execution_fixture() {
    let fixture: Fixture =
        serde_json::from_str(include_str!("fixtures/execution_contract_v1.json")).unwrap();
    assert_eq!(fixture.schema, "runmat-execution-contract-fixture/v1");

    let revision = ProgramRevision::new(
        Digest::sha256(b"graph"),
        Digest::sha256(b"sources"),
        ProgramEnvironment::new(
            1,
            1,
            Digest::sha256(b"runtime"),
            Digest::sha256(b"catalog"),
            "matlab",
        )
        .unwrap(),
    )
    .unwrap()
    .with_domain_contribution(
        DomainContribution::new("runmat.test.config", Digest::sha256(b"tests")).unwrap(),
    )
    .unwrap();
    assert_eq!(
        hex(&revision.canonical_bytes().unwrap()),
        fixture.program_revision_cbor_hex
    );
    assert_eq!(
        revision.canonical_identity(),
        fixture.program_revision_identity
    );

    let envelope = Envelope {
        version: ProtocolVersion::V1,
        message_kind: 7,
        flags: 0,
        sequence: 42,
        payload: vec![1, 2, 3],
    };
    assert_eq!(
        hex(&envelope.encode(ProtocolLimits::default()).unwrap()),
        fixture.envelope_cbor_hex
    );

    let task = TaskId::derive(&[b"fixture"]);
    assert_eq!(task.to_string(), fixture.task_id);
    assert_eq!(fixture.task_id.parse::<TaskId>().unwrap(), task);
}

fn hex(bytes: &[u8]) -> String {
    bytes.iter().map(|byte| format!("{byte:02x}")).collect()
}