multiio 0.2.3

A unified I/O orchestration library for CLI/server applications
Documentation
#![cfg(all(feature = "json", feature = "yaml"))]

use std::env;
use std::fs::File;
use std::io::BufReader;

use multiio::MultiioBuilder;
use multiio::config::PipelineConfig;
use multiio::format::default_registry;

fn run() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = env::args().skip(1);
    let config_path = match args.next() {
        Some(path) => path,
        None => {
            eprintln!("Usage: multiio-pipeline <pipeline-config.yaml>");
            std::process::exit(1);
        }
    };

    let file = File::open(&config_path)?;
    let reader = BufReader::new(file);
    let config: PipelineConfig = serde_yaml::from_reader(reader)?;

    let registry = default_registry();
    let builder = MultiioBuilder::from_pipeline_config(config, registry)?;
    let engine = builder.build()?;

    let mut values: Vec<serde_json::Value> = engine.read_all()?;

    if values.len() == 1 {
        if let serde_json::Value::Array(inner) = &values[0] {
            values = inner.clone();
        }
    }

    if values.len() == 1 {
        engine.write_one_value(&values[0])?;
    } else {
        engine.write_all(&values)?;
    }

    Ok(())
}

fn main() {
    if let Err(e) = run() {
        eprintln!("multiio-pipeline error: {e}");
        std::process::exit(1);
    }
}