multiio 0.2.3

A unified I/O orchestration library for CLI/server applications
Documentation
use std::error::Error;

use multiio::cli::{InputArgs, OutputArgs};
use multiio::format::default_registry;
use multiio::{ErrorPolicy, MultiioBuilder};
use sarge::prelude::*;

fn print_usage() {
    eprintln!("Usage:");
    eprintln!(
        "  multiio_sarge --input <token> [--input <token> ...] --output <token> [--output <token> ...]"
    );
    eprintln!();
    eprintln!("Input tokens:");
    eprintln!("  - | stdin          Read from stdin");
    eprintln!("  =<content>         Inline content (in-memory input)");
    eprintln!("  @<path>            Force treating value as a file path");
    eprintln!();
    eprintln!("Output tokens:");
    eprintln!("  - | stdout         Write to stdout");
    eprintln!("  stderr             Write to stderr");
    eprintln!("  @<path>            Force treating value as a file path");
}

fn run() -> Result<(), Box<dyn Error>> {
    let mut reader = ArgumentReader::new();

    let input_ref = reader.add::<InputArgs>(tag::both('i', "input"));
    let output_ref = reader.add::<OutputArgs>(tag::both('o', "output"));

    let args = reader.parse()?;

    let input = match input_ref.get(&args) {
        Some(Ok(v)) => v,
        Some(Err(_)) => unreachable!("InputArgs parsing is infallible"),
        None => InputArgs::default(),
    };

    let output = match output_ref.get(&args) {
        Some(Ok(v)) => v,
        Some(Err(_)) => unreachable!("OutputArgs parsing is infallible"),
        None => OutputArgs::default(),
    };

    if input.is_empty() || output.is_empty() {
        return Err("missing --input/--output".into());
    }

    let registry = default_registry();
    let engine = MultiioBuilder::new(registry)
        .with_mode(ErrorPolicy::FastFail)
        .with_input_args(&input)
        .with_output_args(&output)
        .build()?;

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

    Ok(())
}

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