diff --git a/src/abstract_tree/value_node.rs b/src/abstract_tree/value_node.rs index c6b773a..418c049 100644 --- a/src/abstract_tree/value_node.rs +++ b/src/abstract_tree/value_node.rs @@ -50,7 +50,17 @@ impl AbstractTree for ValueNode { Ok(r#type) } - fn validate(&self, _context: &Context) -> Result<(), ValidationError> { + fn validate(&self, context: &Context) -> Result<(), ValidationError> { + if let ValueNode::Map(map_assignments) = self { + for (_identifier, r#type, expression) in map_assignments { + if let Some(expected_type) = r#type { + let actual_type = expression.expected_type(context)?; + + expected_type.check(&actual_type)?; + } + } + } + Ok(()) } diff --git a/tests/values.rs b/tests/values.rs index a0b8698..4c0ca9d 100644 --- a/tests/values.rs +++ b/tests/values.rs @@ -126,7 +126,7 @@ fn map_types() { map.insert(Identifier::new("foo"), Value::string("bar".to_string())); assert_eq!( - interpret("{ x = 1, foo = 'bar' }"), + interpret("{ x : int = 1, foo : str = 'bar' }"), Ok(Some(Value::map(map))) ); } @@ -134,13 +134,13 @@ fn map_types() { #[test] fn map_type_errors() { assert_eq!( - interpret("{ foo = 'bar' }"), + interpret("{ foo : bool = 'bar' }"), Err(vec![Error::Validation { error: ValidationError::TypeCheck(TypeCheckError { actual: Type::String, expected: Type::Boolean }), - span: (0..0).into() + span: (0..22).into() }]) ); }