pipa-lang 1.0.0-alpha.1

A tiny template language
Documentation
// SPDX-FileCopyrightText: Copyright 2026 olav@occy.org
// SPDX-License-Identifier: MPL-2.0

use core::error::Error;
use itertools::intersperse;
use pipa::value::Value;
use pipa::value::map::Map;
use std::env;
use std::io;

pub fn main() -> Result<(), Box<dyn Error>> {
    let map = map_from_stdin()?;
    let exp = exp_from_args();

    let value = eval_expression(map, exp.as_bytes())?;
    let value = format_value(value)?;

    println!("{value}");
    Ok(())
}

fn map_from_stdin() -> Result<Map, Box<dyn Error>> {
    let mut input = String::new();
    io::Read::read_to_string(&mut io::stdin(), &mut input)?;

    Ok(pipa::value::parse::json_map(input.trim().as_bytes())?)
}

fn exp_from_args() -> String {
    let args = env::args().skip(1);
    let args = intersperse(args, String::from(" | "));

    args.collect()
}

fn eval_expression(mut map: Map, exp: &[u8]) -> Result<Value, Box<dyn Error>> {
    let adapter = pipa::lang::adapter::Default::default();
    let eval = pipa::lang::eval_expression(&adapter, &mut map, exp)?;

    Ok(eval.result)
}

fn format_value(value: Value) -> Result<String, Box<dyn Error>> {
    let value = value.with_meta("internal-serialize", "simple");
    let value = pipa::value::format::json_string_pretty(value)?;

    Ok(value)
}