mod arrays;
mod includes;
mod model;
mod multi_doc;
mod schema;
mod variables;
pub use arrays::{detect_array_type, is_valid_date_format, parse_array_value, type_name};
pub use includes::{parse_includes, resolve_includes};
pub use model::{parse_nested_scalars, parse_scenarios, parse_v1_model};
pub use multi_doc::{
detect_multi_document, parse_multi_document_yaml, parse_single_document_yaml,
split_yaml_documents,
};
pub use schema::{validate_against_schema, validate_v1_0_0_no_tables};
pub use variables::{is_nested_scalar_section, parse_metadata, parse_scalar_variable, parse_table};
use crate::error::ForgeResult;
use crate::types::ParsedModel;
pub fn parse_model(path: &std::path::Path) -> ForgeResult<ParsedModel> {
let content = std::fs::read_to_string(path)?;
let is_multi_doc = detect_multi_document(&content);
if is_multi_doc {
parse_multi_document_yaml(&content, path)
} else {
parse_single_document_yaml(&content, path)
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Write;
use std::path::Path;
use tempfile::NamedTempFile;
#[test]
fn test_parse_file_not_found() {
let result = parse_model(Path::new("/nonexistent/path/file.yaml"));
assert!(result.is_err());
}
#[test]
fn test_parse_invalid_yaml() {
let yaml_content = "not: valid: yaml: [[[";
let mut temp_file = NamedTempFile::new().unwrap();
temp_file.write_all(yaml_content.as_bytes()).unwrap();
let result = parse_model(temp_file.path());
assert!(result.is_err());
}
#[test]
fn test_parse_table_column_not_array() {
let yaml_content = r#"
_forge_version: "1.0.0"
data:
values: 123
"#;
let mut temp_file = NamedTempFile::new().unwrap();
temp_file.write_all(yaml_content.as_bytes()).unwrap();
let result = parse_model(temp_file.path());
assert!(result.is_err());
}
}