treescript-interpreter 0.1.1

TreeScript interpreter, with some built-in libraries and API to create more
Documentation
extern crate rmp_serde;
use crate::program::ProgramSerial;
use crate::reduce::{
  Consume, GroupDefSerial, GroupMode, GroupRef, Reducer, ReducerClause, Statement,
};
use crate::value::{Prim, Value};
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;

fn test_resources_path(module: &str) -> PathBuf {
  let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
  path.push("test-resources");
  path.push(module);
  return path;
}

#[test]
fn test_serialize_prog() {
  let prog = ProgramSerial {
    libraries: Default::default(),
    main_statements: vec![Statement::Group(GroupRef {
      idx: 0,
      props: vec![Value::Prim(Prim::String(String::from("foo")))],
    })],
    sub_groups: vec![GroupDefSerial {
      props: vec![0],
      mode: GroupMode::Loop,
      statements: vec![
        vec![Statement::Reducer(Reducer {
          input: ReducerClause {
            consumes: vec![Consume::Prim(Prim::String(String::from("bar")))],
            produce: Value::Prim(Prim::String(String::from("bar"))),
            groups: Default::default(),
          },
          output: ReducerClause {
            consumes: vec![Consume::Record(String::from("Foo")), Consume::Bind(1)],
            produce: Value::Record {
              head: String::from("Foo"),
              props: vec![Value::Splice(1)],
            },
            groups: Default::default(),
          },
        })],
        Default::default(),
        Default::default(),
      ],
    }],
  };

  let vec = rmp_serde::to_vec(&prog).unwrap();
  let mut write_path = test_resources_path("program");
  write_path.push("SerializeRust.msgpack");
  let mut file = File::create(write_path).unwrap();
  file.write_all(vec.as_slice()).unwrap();
}