#[macro_use] extern crate log; #[macro_use] extern crate error_chain; extern crate toml; pub extern crate modelica_parser; pub mod modelica_model; pub mod transpile_js; pub mod transpile_python; pub mod transpile_scheme; pub mod repr_latex; use std::path::Path; use std::fs; use std::io::Read; use std::fs::File; mod errors { // Create the Error, ErrorKind, ResultExt, and Result types error_chain! { } } pub use errors::*; #[derive(Debug, PartialEq)] pub enum ModelVarType { Independent, Dependent, Constant, Time, State, Parameter, } #[derive(Debug, PartialEq)] pub struct ModelVar { pub slug: String, pub name_en: Option, pub vtype: ModelVarType, pub latex: Option, pub units_si: Option, } #[derive(Debug, PartialEq)] pub struct ModelEntry { pub ast: modelica_parser::ModelicaModel, pub markdown: String, } pub fn load_model_entry(p: &Path) -> Result { debug!("Attempting to load model from: {:?}", p); let ast = { let mut s = String::new(); try!(File::open(p.join("model.modelica")) .and_then(|mut f| f.read_to_string(&mut s)) .map_err(|e| e.to_string())); try!(modelica_parser::parse_model(&s).map_err(|e| format!("{:?}", e))) }; let markdown = { let mut s = String::new(); try!(File::open(p.join("page.md")) .and_then(|mut f| f.read_to_string(&mut s)) .map_err(|e| e.to_string())); s }; Ok(ModelEntry { ast: ast, markdown: markdown, }) } pub fn search_models(p: &Path) -> Vec { let metadata = match fs::metadata(p) { Err(_) => return vec![], Ok(m) => m, }; if metadata.is_dir() { fs::read_dir(p) .unwrap() // exists and is_dir(); could be a race condition though? .map(|x| x.unwrap()) .filter(|x| x.metadata().unwrap().is_dir()) .filter(|x| x.path().join("model.modelica").exists()) .map(|x| x.path().to_string_lossy().to_string()) .collect() } else { vec![] } }