onnx-runtime-ep-api 0.1.0-dev.5

Execution Provider API for the ORT 2.0 runtime: ExecutionProvider and Kernel traits, OpRegistry, and the ORT graph ABI bridge
use std::ffi::CString;
use std::path::PathBuf;

use onnx_runtime_ep_api::abi::OrtGraphView;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = std::env::args_os().skip(1);
    let model = PathBuf::from(
        args.next()
            .ok_or("usage: query_plugin_claims <model.onnx> <plugin.dylib> [registration-name]")?,
    );
    let plugin = PathBuf::from(
        args.next()
            .ok_or("usage: query_plugin_claims <model.onnx> <plugin.dylib> [registration-name]")?,
    );
    let registration_name = args
        .next()
        .map(|s| CString::new(s.to_string_lossy().as_bytes()))
        .transpose()?;

    let graph = onnx_runtime_loader::load_model(&model)?;
    let view = OrtGraphView::new(&graph);
    let claims = view.query_plugin_capabilities(&plugin, registration_name.as_deref())?;

    println!("claims={}", claims.len());
    for (i, claim) in claims.iter().enumerate() {
        let names: Vec<_> = claim
            .node_ids
            .iter()
            .map(|&id| {
                let node = graph.node(id);
                if node.name.is_empty() {
                    format!("#{}:{}", id.0, node.op_type)
                } else {
                    format!("#{}:{}:{}", id.0, node.op_type, node.name)
                }
            })
            .collect();
        println!(
            "claim[{i}] nodes={} inputs={} outputs={}",
            claim.node_ids.len(),
            claim.input_values.len(),
            claim.output_values.len()
        );
        println!("  {}", names.join(", "));
    }
    Ok(())
}