runmat-execution-artifact 0.6.2

Canonical execution bundles and program artifacts for RunMat
Documentation
use std::io::Write;

use crate::{ArtifactError, ArtifactResult, ExecutionBundle};

use super::{
    canonical::write_bytes,
    manifest_codec::{encode_descriptor, encode_manifest},
    ArchiveLimits, MAGIC,
};

pub fn write_bundle(
    bundle: &ExecutionBundle,
    mut writer: impl Write,
    limits: ArchiveLimits,
) -> ArtifactResult<()> {
    bundle.validate()?;
    if bundle.objects.len() > limits.max_objects as usize {
        return Err(ArtifactError::Limit("too many archive objects".into()));
    }
    writer.write_all(MAGIC)?;
    let manifest = encode_manifest(&bundle.manifest)?;
    write_bytes(&mut writer, &manifest, limits.max_manifest_bytes)?;
    writer.write_all(&(bundle.objects.len() as u32).to_be_bytes())?;
    for object in &bundle.objects {
        let descriptor = encode_descriptor(&object.descriptor)?;
        write_bytes(&mut writer, &descriptor, limits.max_manifest_bytes)?;
        write_bytes(&mut writer, &object.bytes, limits.max_object_bytes)?;
    }
    Ok(())
}