diff options
author | bnewbold <bnewbold@robocracy.org> | 2016-10-29 16:29:35 -0700 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2016-10-29 16:32:14 -0700 |
commit | 6915fb25b46cb9d7356caec384ab824ea78c5e4c (patch) | |
tree | b51466034eb45a2334348588670af132e2d2d2b4 /src/lib.rs | |
parent | df2a28f0381971cbc48ced38d9c12a780bf6f09f (diff) | |
download | modelthing-6915fb25b46cb9d7356caec384ab824ea78c5e4c.tar.gz modelthing-6915fb25b46cb9d7356caec384ab824ea78c5e4c.zip |
stub out routines for loading model+metadata from file
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 113 |
1 files changed, 113 insertions, 0 deletions
@@ -1,7 +1,120 @@ +#[macro_use] +extern crate log; + pub mod modelica_parser; pub mod modelica_ast; +use std::path::Path; +use std::fs; +use std::io::Read; +use std::fs::File; + +#[derive(Debug, PartialEq)] +struct ModelMetadata { + slug: String, + name_en: String, + description_en: Option<String>, + vars: Vec<ModelVar>, +} + +#[derive(Debug, PartialEq)] +enum ModelVarType { + Independent, + Dependent, + Constant, +} + +#[derive(Debug, PartialEq)] +struct ModelVar { + slug: String, + name_en: String, + vtype: Option<ModelVarType>, + latex: Option<String>, + units_si: Option<String>, +} + +#[derive(Debug, PartialEq)] +struct ModelEntry { + ast: modelica_ast::ModelicaModel, + metadata: ModelMetadata, + markdown: String, +} + +// TODO: this +fn parse_metadata(s: String) -> Result<ModelMetadata,String> { + Ok(ModelMetadata { + slug: "dummy".to_string(), + name_en: "Bogus Dummy Model".to_string(), + description_en: None, + vars: vec![], + }) +} + +fn load_model_entry(p: &Path) -> Result<ModelEntry,String> { + 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 metadata = { + let mut s = String::new(); + try!(File::open(p.join("metadata.toml")).and_then(|mut f| f.read_to_string(&mut s)).map_err(|e| e.to_string())); + parse_metadata(s).unwrap() + }; + + 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, + metadata: metadata, + markdown: markdown, + }) +} + +// TODO: have this check for model.modelica etc +fn search_models(p: &Path) -> Vec<String> { + if fs::metadata(p).unwrap().is_dir() { + fs::read_dir(p).unwrap() + .map(|x| x.unwrap()) + .filter(|x| x.metadata().unwrap().is_dir()) + .map(|x| x.path().to_string_lossy().to_string()) + .collect() + } else { + vec![] + } +} + +/* ******************************** Tests ******************************* */ + +#[test] +fn test_parse_metadata() { + assert_eq!(parse_metadata("asdf".to_string()).unwrap(), + ModelMetadata { + slug: "dummy".to_string(), + name_en: "Bogus Dummy Model".to_string(), + description_en: None, + vars: vec![], + }); +} + +#[test] +fn test_load_model_entry() { + load_model_entry(Path::new("./examples/classic_gravitation/")).unwrap(); +} + +#[test] +fn test_search_models() { + assert_eq!(search_models(Path::new("./examples/")).len() > 1, true); +} + #[test] fn test_lexical() { assert_eq!(&format!("{:?}", modelica_parser::parse_integer("+123").unwrap()), |