mrps 0.1.1

Mini reverse proxy server
mod file;
mod parse;
mod fetch;
mod format;
mod command;

use file::IO;
use parse::parse;
use std::error::Error;
use command::command;
use std::path::PathBuf;
use format::{format, bytes};
use minijinja::{Environment, path_loader, Value};
use fetch::{get, delete, head, options, post, put, patch};

pub fn new(dir: PathBuf, data: Option<PathBuf>) -> Result<Environment<'static>, Box<dyn Error>> {
    let mut env = Environment::new();
    env.set_loader(path_loader(dir));
    env.add_filter("parse", parse);
    env.add_filter("bytes", bytes);
    env.add_filter("format", format);
    env.add_function("get", get);
    env.add_function("post", post);
    env.add_function("put", put);
    env.add_function("patch", patch);
    env.add_function("head", head);
    env.add_function("options", options);
    env.add_function("delete", delete);
    env.add_function("command", command);
    env.add_function("log", |message: &str| {
        println!("{}", message);
    });
    if let Some(data) = data {
        let io1 = IO::new(data)?;
        let io2 = io1.clone();
        let io3 = io1.clone();
        env.add_function("read", move |entry: &str| -> Option<Value> {
            io1.read(entry)
        });
        env.add_function("write", move |
            file: &str,
            data: &Vec<u8>
        | -> Option<String> {
            io2.write(file, data)
        });
        env.add_function("remove", move |entry: &str| -> Option<String> {
            io3.remove(entry)
        });
    }

    Ok(env)
}