onnx-std 0.1.0-dev.4

Pure-Rust ONNX standard library: model I/O, textual format, and an extensible validator, built on the shared onnx-runtime-ir IR (see docs/ONNX_RS.md)
Documentation
//! Descriptor-driven protobuf textual serialization.

use std::sync::OnceLock;

use onnx_runtime_loader::proto::{FILE_DESCRIPTOR_SET, ModelProto};
use prost::Message;
use prost_reflect::{DescriptorPool, DynamicMessage, MessageDescriptor};

use crate::{Error, Result};

fn model_descriptor() -> MessageDescriptor {
    static POOL: OnceLock<DescriptorPool> = OnceLock::new();
    POOL.get_or_init(|| {
        DescriptorPool::decode(FILE_DESCRIPTOR_SET)
            .expect("the generated ONNX descriptor set must be valid")
    })
    .get_message_by_name("onnx.ModelProto")
    .expect("the bound ONNX schema must define onnx.ModelProto")
}

pub(crate) fn to_dynamic(proto: &ModelProto) -> Result<DynamicMessage> {
    DynamicMessage::decode(model_descriptor(), proto.encode_to_vec().as_slice())
        .map_err(|error| Error::Json(error.to_string()))
}

pub(crate) fn from_dynamic(message: &DynamicMessage) -> Result<ModelProto> {
    ModelProto::decode(message.encode_to_vec().as_slice())
        .map_err(|error| Error::Json(error.to_string()))
}

pub(crate) fn descriptor() -> MessageDescriptor {
    model_descriptor()
}