pype 0.2.1

Python oneliner helper
Documentation
use crate::types;

pub fn do_inpt(
    cur: types::LispExpRef,
    fifo_path_str: &str,
    _opts: &getopts::Options,
    _args: &getopts::Matches,
    arena: &mut types::LispArena,
) -> types::LispExpRef {
    let s_with = arena.alloc(types::LispAtom::new_symbol("with").into());
    let s_call = arena.alloc(types::LispAtom::new_symbol("call").into());
    let s_open = arena.alloc(types::LispAtom::new_symbol("open").into());
    let s_f = arena.alloc(types::LispAtom::new_symbol("f").into());
    let v_fifo_path = arena.alloc(fifo_path_str.into());

    crate::alloc!(arena, [s_with, [s_call, s_open, v_fifo_path], s_f, cur])
}

pub fn do_e(
    _opts: &getopts::Options,
    args: &getopts::Matches,
    arena: &mut types::LispArena,
) -> types::LispExpRef {
    let commands = args.opt_strs("e");
    let s_progn = arena.alloc(types::LispAtom::new_symbol("progn").into());

    let mut cur = crate::alloc!(arena, []);
    for cmd in commands.iter().rev() {
        let v = arena.alloc(types::LispAtom::new_raw_text(cmd).into());
        cur = crate::alloc!(arena, [v; cur]);
    }
    crate::alloc!(arena, [s_progn; cur])
}

pub fn do_n(
    cur: types::LispExpRef,
    _opts: &getopts::Options,
    args: &getopts::Matches,
    arena: &mut types::LispArena,
) -> types::LispExpRef {
    match args.opt_present("n") {
        true => {
            let s_for = arena.alloc(types::LispAtom::new_symbol("for").into());
            let s_line = arena.alloc(types::LispAtom::new_symbol("line").into());
            let s_f = arena.alloc(types::LispAtom::new_symbol("f").into());
            crate::alloc!(arena, [s_for, s_line, s_f, cur])
        }
        false => cur,
    }
}

pub fn do_l(
    cur: types::LispExpRef,
    _opts: &getopts::Options,
    args: &getopts::Matches,
    arena: &mut types::LispArena,
) -> types::LispExpRef {
    if args.opt_present("l") && args.opt_present("n") {
        let s_progn = arena.alloc(types::LispAtom::new_symbol("progn").into());
        let s_assign = arena.alloc(types::LispAtom::new_symbol("assign").into());
        let s_line = arena.alloc(types::LispAtom::new_symbol("line").into());
        let s_call = arena.alloc(types::LispAtom::new_symbol("call").into());
        let s_attr = arena.alloc(types::LispAtom::new_symbol("attr").into());
        let s_rstrip = arena.alloc(types::LispAtom::new_symbol("rstrip").into());
        crate::alloc!(
            arena,
            [
                s_progn,
                [s_assign, s_line, [s_call, [s_attr, s_line, s_rstrip]]],
                cur
            ]
        )
    } else {
        cur
    }
}

pub fn do_l_post(
    cur: types::LispExpRef,
    _opts: &getopts::Options,
    args: &getopts::Matches,
    arena: &mut types::LispArena,
) -> types::LispExpRef {
    match args.opt_present("l") {
        true => cur,
        false => {
            let s_progn = arena.alloc(types::LispAtom::new_symbol("progn").into());
            let s_import = arena.alloc(types::LispAtom::new_symbol("import").into());
            let s_assign = arena.alloc(types::LispAtom::new_symbol("assign").into());
            let s_star = arena.alloc(types::LispAtom::new_symbol("*").into());
            let s_dstar = arena.alloc(types::LispAtom::new_symbol("**").into());
            let s_kw = arena.alloc(types::LispAtom::new_symbol("kw").into());
            let s_attr = arena.alloc(types::LispAtom::new_symbol("attr").into());
            let s_call = arena.alloc(types::LispAtom::new_symbol("call").into());

            let s_builtins = arena.alloc(types::LispAtom::new_symbol("builtins").into());
            let s_print = arena.alloc(types::LispAtom::new_symbol("print").into());
            let s_lambda = arena.alloc(types::LispAtom::new_symbol("lambda").into());
            let s_args = arena.alloc(types::LispAtom::new_symbol("args").into());
            let s_kwargs = arena.alloc(types::LispAtom::new_symbol("kwargs").into());
            let s_end = arena.alloc(types::LispAtom::new_symbol("end").into());
            let v_empty = arena.alloc("".into());

            let stmt_import = crate::alloc!(arena, [s_import, s_builtins]);
            let exp_print = crate::alloc!(
                arena,
                [
                    s_call,
                    [s_attr, s_builtins, s_print],
                    [s_star, s_args],
                    [s_dstar, s_kwargs],
                    [s_kw, s_end, v_empty]
                ]
            );
            let exp_lambda = crate::alloc!(
                arena,
                [s_lambda, [[s_star, s_args], [s_dstar, s_kwargs]], exp_print]
            );
            let stmt_assign = crate::alloc!(arena, [s_assign, s_print, exp_lambda]);
            crate::alloc!(arena, [s_progn, stmt_import, stmt_assign, cur])
        }
    }
}

pub fn do_m(
    cur: types::LispExpRef,
    _opts: &getopts::Options,
    args: &getopts::Matches,
    arena: &mut types::LispArena,
) -> types::LispExpRef {
    let modules = args.opt_strs("m");
    if modules.is_empty() {
        return cur;
    }

    let s_progn = arena.alloc(types::LispAtom::new_symbol("progn").into());
    let s_import = arena.alloc(types::LispAtom::new_symbol("import").into());

    let mut cur = crate::alloc!(arena, [cur]);
    for module in modules.iter().rev() {
        let v = arena.alloc(types::LispAtom::new_raw_text(module).into());
        cur = crate::alloc!(arena, [[s_import, v]; cur]);
    }
    crate::alloc!(arena, [s_progn; cur])
}