mirror of
https://github.com/zaphar/ucg.git
synced 2025-07-22 18:19:54 -04:00
FEATURE: Use normalized paths for the import cached lookup
This commit is contained in:
parent
08aee3548a
commit
a821ff6313
@ -1,7 +1,8 @@
|
|||||||
use super::{Builder, Val};
|
use super::{Builder, Val};
|
||||||
|
use std;
|
||||||
|
|
||||||
fn assert_build<S: Into<String>>(input: S, assert: &str) {
|
fn assert_build<S: Into<String>>(input: S, assert: &str) {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.build_file_string(input.into()).unwrap();
|
b.build_file_string(input.into()).unwrap();
|
||||||
let result = b.eval_string(assert).unwrap();
|
let result = b.eval_string(assert).unwrap();
|
||||||
if let &Val::Boolean(ok) = result.as_ref() {
|
if let &Val::Boolean(ok) = result.as_ref() {
|
||||||
|
@ -23,7 +23,9 @@ use std::fmt::{Display, Formatter};
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
use std::path::PathBuf;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
use std::string::ToString;
|
||||||
|
|
||||||
use ast::*;
|
use ast::*;
|
||||||
use error;
|
use error;
|
||||||
@ -35,6 +37,8 @@ impl MacroDef {
|
|||||||
/// Expands a ucg Macro using the given arguments into a new Tuple.
|
/// Expands a ucg Macro using the given arguments into a new Tuple.
|
||||||
pub fn eval(
|
pub fn eval(
|
||||||
&self,
|
&self,
|
||||||
|
root: PathBuf,
|
||||||
|
env: Rc<Val>,
|
||||||
mut args: Vec<Rc<Val>>,
|
mut args: Vec<Rc<Val>>,
|
||||||
) -> Result<Vec<(Positioned<String>, Rc<Val>)>, Box<Error>> {
|
) -> Result<Vec<(Positioned<String>, Rc<Val>)>, Box<Error>> {
|
||||||
// Error conditions. If the args don't match the length and types of the argdefs then this is
|
// Error conditions. If the args don't match the length and types of the argdefs then this is
|
||||||
@ -54,7 +58,7 @@ impl MacroDef {
|
|||||||
for (i, arg) in args.drain(0..).enumerate() {
|
for (i, arg) in args.drain(0..).enumerate() {
|
||||||
scope.entry(self.argdefs[i].clone()).or_insert(arg.clone());
|
scope.entry(self.argdefs[i].clone()).or_insert(arg.clone());
|
||||||
}
|
}
|
||||||
let b = Builder::new_with_scope(scope);
|
let b = Builder::new_with_env_and_scope(root, scope, env);
|
||||||
let mut result: Vec<(Positioned<String>, Rc<Val>)> = Vec::new();
|
let mut result: Vec<(Positioned<String>, Rc<Val>)> = Vec::new();
|
||||||
for &(ref key, ref expr) in self.fields.iter() {
|
for &(ref key, ref expr) in self.fields.iter() {
|
||||||
// We clone the expressions here because this macro may be consumed
|
// We clone the expressions here because this macro may be consumed
|
||||||
@ -272,6 +276,7 @@ type ValueMap = HashMap<Positioned<String>, Rc<Val>>;
|
|||||||
|
|
||||||
/// Handles building ucg code.
|
/// Handles building ucg code.
|
||||||
pub struct Builder {
|
pub struct Builder {
|
||||||
|
root: PathBuf,
|
||||||
env: Rc<Val>,
|
env: Rc<Val>,
|
||||||
/// assets are other parsed files from import statements. They
|
/// assets are other parsed files from import statements. They
|
||||||
/// are keyed by the normalized import path. This acts as a cache
|
/// are keyed by the normalized import path. This acts as a cache
|
||||||
@ -344,21 +349,26 @@ impl Builder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs a new Builder.
|
/// Constructs a new Builder.
|
||||||
pub fn new() -> Self {
|
pub fn new<P: Into<PathBuf>>(root: P) -> Self {
|
||||||
Self::new_with_scope(HashMap::new())
|
Self::new_with_scope(root, HashMap::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs a new Builder with a provided scope.
|
/// Constructs a new Builder with a provided scope.
|
||||||
pub fn new_with_scope(scope: ValueMap) -> Self {
|
pub fn new_with_scope<P: Into<PathBuf>>(root: P, scope: ValueMap) -> Self {
|
||||||
let env_vars: Vec<(Positioned<String>, Rc<Val>)> = env::vars()
|
let env_vars: Vec<(Positioned<String>, Rc<Val>)> = env::vars()
|
||||||
.map(|t| (Positioned::new(t.0, 0, 0), Rc::new(t.1.into())))
|
.map(|t| (Positioned::new(t.0, 0, 0), Rc::new(t.1.into())))
|
||||||
.collect();
|
.collect();
|
||||||
Self::new_with_env_and_scope(scope, Val::Tuple(env_vars))
|
Self::new_with_env_and_scope(root, scope, Rc::new(Val::Tuple(env_vars)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_with_env_and_scope(scope: ValueMap, env: Val) -> Self {
|
pub fn new_with_env_and_scope<P: Into<PathBuf>>(
|
||||||
|
root: P,
|
||||||
|
scope: ValueMap,
|
||||||
|
env: Rc<Val>,
|
||||||
|
) -> Self {
|
||||||
Builder {
|
Builder {
|
||||||
env: Rc::new(env),
|
root: root.into(),
|
||||||
|
env: env,
|
||||||
assets: HashMap::new(),
|
assets: HashMap::new(),
|
||||||
files: HashSet::new(),
|
files: HashSet::new(),
|
||||||
out: scope,
|
out: scope,
|
||||||
@ -416,10 +426,13 @@ impl Builder {
|
|||||||
fn build_import(&mut self, def: &ImportDef) -> Result<Rc<Val>, Box<Error>> {
|
fn build_import(&mut self, def: &ImportDef) -> Result<Rc<Val>, Box<Error>> {
|
||||||
let sym = &def.name;
|
let sym = &def.name;
|
||||||
let positioned_sym = sym.into();
|
let positioned_sym = sym.into();
|
||||||
if !self.files.contains(&def.path.fragment) {
|
let mut normalized = self.root.to_path_buf();
|
||||||
|
normalized.push(&def.path.fragment);
|
||||||
|
let key = normalized.to_str().unwrap().to_string();
|
||||||
|
if !self.files.contains(&key) {
|
||||||
// Only parse the file once on import.
|
// Only parse the file once on import.
|
||||||
if self.assets.get(&positioned_sym).is_none() {
|
if self.assets.get(&positioned_sym).is_none() {
|
||||||
let mut b = Self::new();
|
let mut b = Self::new(normalized);
|
||||||
try!(b.build_file(&def.path.fragment));
|
try!(b.build_file(&def.path.fragment));
|
||||||
let fields: Vec<(Positioned<String>, Rc<Val>)> = b.out.drain().collect();
|
let fields: Vec<(Positioned<String>, Rc<Val>)> = b.out.drain().collect();
|
||||||
let result = Rc::new(Val::Tuple(fields));
|
let result = Rc::new(Val::Tuple(fields));
|
||||||
@ -985,7 +998,7 @@ impl Builder {
|
|||||||
for arg in args.iter() {
|
for arg in args.iter() {
|
||||||
argvals.push(try!(self.eval_expr(arg)));
|
argvals.push(try!(self.eval_expr(arg)));
|
||||||
}
|
}
|
||||||
let fields = try!(m.eval(argvals));
|
let fields = try!(m.eval(self.root.clone(), self.env.clone(), argvals));
|
||||||
return Ok(Rc::new(Val::Tuple(fields)));
|
return Ok(Rc::new(Val::Tuple(fields)));
|
||||||
}
|
}
|
||||||
Err(Box::new(error::Error::new(
|
Err(Box::new(error::Error::new(
|
||||||
@ -1048,7 +1061,7 @@ impl Builder {
|
|||||||
let mut out = Vec::new();
|
let mut out = Vec::new();
|
||||||
for expr in l.iter() {
|
for expr in l.iter() {
|
||||||
let argvals = vec![try!(self.eval_expr(expr))];
|
let argvals = vec![try!(self.eval_expr(expr))];
|
||||||
let fields = try!(macdef.eval(argvals));
|
let fields = try!(macdef.eval(self.root.clone(), self.env.clone(), argvals));
|
||||||
if let Some(v) = Self::find_in_fieldlist(&def.field, &fields) {
|
if let Some(v) = Self::find_in_fieldlist(&def.field, &fields) {
|
||||||
match def.typ {
|
match def.typ {
|
||||||
ListOpType::Map => {
|
ListOpType::Map => {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
use super::{Builder, CallDef, MacroDef, SelectDef, Val};
|
use super::{Builder, CallDef, MacroDef, SelectDef, Val};
|
||||||
use ast::*;
|
use ast::*;
|
||||||
|
|
||||||
|
use std;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
fn test_expr_to_val(mut cases: Vec<(Expression, Val)>, b: Builder) {
|
fn test_expr_to_val(mut cases: Vec<(Expression, Val)>, b: Builder) {
|
||||||
@ -10,7 +12,7 @@ fn test_expr_to_val(mut cases: Vec<(Expression, Val)>, b: Builder) {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_div_expr() {
|
fn test_eval_div_expr() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -39,7 +41,7 @@ fn test_eval_div_expr() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected Float")]
|
#[should_panic(expected = "Expected Float")]
|
||||||
fn test_eval_div_expr_fail() {
|
fn test_eval_div_expr_fail() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -58,7 +60,7 @@ fn test_eval_div_expr_fail() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_mul_expr() {
|
fn test_eval_mul_expr() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -87,7 +89,7 @@ fn test_eval_mul_expr() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected Float")]
|
#[should_panic(expected = "Expected Float")]
|
||||||
fn test_eval_mul_expr_fail() {
|
fn test_eval_mul_expr_fail() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -106,7 +108,7 @@ fn test_eval_mul_expr_fail() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_subtract_expr() {
|
fn test_eval_subtract_expr() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -135,7 +137,7 @@ fn test_eval_subtract_expr() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected Float")]
|
#[should_panic(expected = "Expected Float")]
|
||||||
fn test_eval_subtract_expr_fail() {
|
fn test_eval_subtract_expr_fail() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -154,7 +156,7 @@ fn test_eval_subtract_expr_fail() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_add_expr() {
|
fn test_eval_add_expr() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -222,7 +224,7 @@ fn test_eval_add_expr() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected Float")]
|
#[should_panic(expected = "Expected Float")]
|
||||||
fn test_eval_add_expr_fail() {
|
fn test_eval_add_expr_fail() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -271,13 +273,13 @@ fn test_eval_simple_expr() {
|
|||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
Builder::new(),
|
Builder::new(std::env::current_dir().unwrap()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_simple_lookup_expr() {
|
fn test_eval_simple_lookup_expr() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("var1".to_string(), 1, 0))
|
.entry(value_node!("var1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Int(1)));
|
.or_insert(Rc::new(Val::Int(1)));
|
||||||
@ -294,7 +296,7 @@ fn test_eval_simple_lookup_expr() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_simple_lookup_error() {
|
fn test_eval_simple_lookup_error() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("var1".to_string(), 1, 0))
|
.entry(value_node!("var1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Int(1)));
|
.or_insert(Rc::new(Val::Int(1)));
|
||||||
@ -304,7 +306,7 @@ fn test_eval_simple_lookup_error() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_selector_expr() {
|
fn test_eval_selector_expr() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("var1".to_string(), 1, 0))
|
.entry(value_node!("var1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Tuple(vec![
|
.or_insert(Rc::new(Val::Tuple(vec![
|
||||||
@ -368,7 +370,7 @@ fn test_eval_selector_expr() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_eval_selector_list_expr() {
|
fn test_eval_selector_list_expr() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("var1".to_string(), 1, 1))
|
.entry(value_node!("var1".to_string(), 1, 1))
|
||||||
.or_insert(Rc::new(Val::List(vec![
|
.or_insert(Rc::new(Val::List(vec![
|
||||||
@ -394,7 +396,7 @@ fn test_eval_selector_list_expr() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Unable to find tpl1")]
|
#[should_panic(expected = "Unable to find tpl1")]
|
||||||
fn test_expr_copy_no_such_tuple() {
|
fn test_expr_copy_no_such_tuple() {
|
||||||
let b = Builder::new();
|
let b = Builder::new(std::env::current_dir().unwrap());
|
||||||
test_expr_to_val(
|
test_expr_to_val(
|
||||||
vec![
|
vec![
|
||||||
(
|
(
|
||||||
@ -413,7 +415,7 @@ fn test_expr_copy_no_such_tuple() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected Tuple got Int(1)")]
|
#[should_panic(expected = "Expected Tuple got Int(1)")]
|
||||||
fn test_expr_copy_not_a_tuple() {
|
fn test_expr_copy_not_a_tuple() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("tpl1".to_string(), 1, 0))
|
.entry(value_node!("tpl1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Int(1)));
|
.or_insert(Rc::new(Val::Int(1)));
|
||||||
@ -435,7 +437,7 @@ fn test_expr_copy_not_a_tuple() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected type Integer for field fld1 but got String")]
|
#[should_panic(expected = "Expected type Integer for field fld1 but got String")]
|
||||||
fn test_expr_copy_field_type_error() {
|
fn test_expr_copy_field_type_error() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("tpl1".to_string(), 1, 0))
|
.entry(value_node!("tpl1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Tuple(vec![
|
.or_insert(Rc::new(Val::Tuple(vec![
|
||||||
@ -468,7 +470,7 @@ fn test_expr_copy_field_type_error() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_expr_copy() {
|
fn test_expr_copy() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("tpl1".to_string(), 1, 0))
|
.entry(value_node!("tpl1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Tuple(vec![
|
.or_insert(Rc::new(Val::Tuple(vec![
|
||||||
@ -539,7 +541,7 @@ fn test_expr_copy() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_macro_call() {
|
fn test_macro_call() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("tstmac".to_string(), 1, 0))
|
.entry(value_node!("tstmac".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Macro(MacroDef {
|
.or_insert(Rc::new(Val::Macro(MacroDef {
|
||||||
@ -577,7 +579,7 @@ fn test_macro_call() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Unable to find arg1")]
|
#[should_panic(expected = "Unable to find arg1")]
|
||||||
fn test_macro_hermetic() {
|
fn test_macro_hermetic() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("arg1".to_string(), 1, 0))
|
.entry(value_node!("arg1".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::String("bar".to_string())));
|
.or_insert(Rc::new(Val::String("bar".to_string())));
|
||||||
@ -617,7 +619,7 @@ fn test_macro_hermetic() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_select_expr() {
|
fn test_select_expr() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("foo".to_string(), 1, 0))
|
.entry(value_node!("foo".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::String("bar".to_string())));
|
.or_insert(Rc::new(Val::String("bar".to_string())));
|
||||||
@ -679,7 +681,7 @@ fn test_select_expr() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "Expected String but got Integer in Select expression")]
|
#[should_panic(expected = "Expected String but got Integer in Select expression")]
|
||||||
fn test_select_expr_not_a_string() {
|
fn test_select_expr_not_a_string() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.out
|
b.out
|
||||||
.entry(value_node!("foo".to_string(), 1, 0))
|
.entry(value_node!("foo".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Int(4)));
|
.or_insert(Rc::new(Val::Int(4)));
|
||||||
@ -714,7 +716,7 @@ fn test_select_expr_not_a_string() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_let_statement() {
|
fn test_let_statement() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
let stmt = Statement::Let(LetDef {
|
let stmt = Statement::Let(LetDef {
|
||||||
name: make_tok!("foo", 1, 1),
|
name: make_tok!("foo", 1, 1),
|
||||||
value: Expression::Simple(Value::String(value_node!("bar".to_string(), 1, 1))),
|
value: Expression::Simple(Value::String(value_node!("bar".to_string(), 1, 1))),
|
||||||
@ -733,7 +735,7 @@ fn test_let_statement() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_build_file_string() {
|
fn test_build_file_string() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.build_file_string("let foo = 1;".to_string()).unwrap();
|
b.build_file_string("let foo = 1;".to_string()).unwrap();
|
||||||
let key = value_node!("foo".to_string(), 1, 0);
|
let key = value_node!("foo".to_string(), 1, 0);
|
||||||
assert!(b.out.contains_key(&key));
|
assert!(b.out.contains_key(&key));
|
||||||
@ -741,7 +743,7 @@ fn test_build_file_string() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_asset_symbol_lookups() {
|
fn test_asset_symbol_lookups() {
|
||||||
let mut b = Builder::new();
|
let mut b = Builder::new(std::env::current_dir().unwrap());
|
||||||
b.assets
|
b.assets
|
||||||
.entry(value_node!("foo".to_string(), 1, 0))
|
.entry(value_node!("foo".to_string(), 1, 0))
|
||||||
.or_insert(Rc::new(Val::Tuple(vec![
|
.or_insert(Rc::new(Val::Tuple(vec![
|
||||||
|
@ -60,7 +60,7 @@ fn main() {
|
|||||||
let out = matches.value_of("out");
|
let out = matches.value_of("out");
|
||||||
let sym = matches.value_of("sym");
|
let sym = matches.value_of("sym");
|
||||||
let target = matches.value_of("target").unwrap();
|
let target = matches.value_of("target").unwrap();
|
||||||
let mut builder = build::Builder::new();
|
let mut builder = build::Builder::new(std::env::current_dir().unwrap());
|
||||||
match ConverterRunner::new(target) {
|
match ConverterRunner::new(target) {
|
||||||
Ok(converter) => {
|
Ok(converter) => {
|
||||||
let result = builder.build_file(file);
|
let result = builder.build_file(file);
|
||||||
@ -91,7 +91,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
} else if let Some(matches) = app.subcommand_matches("validate") {
|
} else if let Some(matches) = app.subcommand_matches("validate") {
|
||||||
let file = matches.value_of("INPUT").unwrap();
|
let file = matches.value_of("INPUT").unwrap();
|
||||||
let mut builder = build::Builder::new();
|
let mut builder = build::Builder::new(std::env::current_dir().unwrap());
|
||||||
builder.build_file(file).unwrap();
|
builder.build_file(file).unwrap();
|
||||||
println!("File Validates");
|
println!("File Validates");
|
||||||
process::exit(0);
|
process::exit(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user