extern crate modelica_parser; use self::modelica_parser::*; pub trait TranspileJS { fn repr_js(&self) -> Result; } impl TranspileJS for ModelicaModel { fn repr_js(&self) -> Result { let mut constants = vec![]; for (c, e) in self.get_constant_vars() { if let Some(v) = e { constants.push(format!("var {} = {};", c, try!(v.repr_js()))); } } let mut binds = vec![]; let mut outputs = vec![]; for eq in self.equations.iter() { if let Expr::Ident(ref symb) = eq.lhs { binds.push(format!("var {} = {};", symb, try!(eq.rhs.repr_js()))); outputs.push(symb.to_string()); } else { return Err("Expected an identifier on LHS (in this partial implementation)" .to_string()); } } Ok(format!(r#"function {slug}({args}) {{ {constants} {binds} return [{outputs}]; }}"#, slug = "f", args = self.get_free_vars().join(", "), constants = constants.join("\n "), binds = binds.join("\n "), outputs = outputs.join(", "))) } } impl TranspileJS for Expr { fn repr_js(&self) -> Result { use modelica_parser::Expr::*; match *self { Integer(e) => Ok(format!("{}", e)), Float(e) => Ok(format!("{}", e)), Boolean(true) => Ok(format!("true")), Boolean(false) => Ok(format!("false")), StringLiteral(ref s) => Ok(format!("\"{}\"", s)), Ident(ref e) => Ok(format!("{}", e)), Der(ref e) => Ok(format!("der({})", try!(e.repr_js()))), Sign(ref e) => Ok(format!("sign({})", try!(e.repr_js()))), MathUnaryExpr(func, ref e) => Ok(format!("{:?}({})", func, try!(e.repr_js()))), BinExpr(op, ref l, ref r) => { Ok(format!("({} {:?} {})", try!(l.repr_js()), op, try!(r.repr_js()))) } Array(_) => Err("Array unimplemented".to_string()), } } }