summaryrefslogtreecommitdiffstats
path: root/crates/rebel-lang/src/typing.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/rebel-lang/src/typing.rs')
-rw-r--r--crates/rebel-lang/src/typing.rs42
1 files changed, 23 insertions, 19 deletions
diff --git a/crates/rebel-lang/src/typing.rs b/crates/rebel-lang/src/typing.rs
index 1455732..94c84ba 100644
--- a/crates/rebel-lang/src/typing.rs
+++ b/crates/rebel-lang/src/typing.rs
@@ -29,7 +29,7 @@ pub enum Type {
Str,
Tuple(Vec<Type>),
Array(Box<Type>, ArrayLen),
- Map(HashMap<String, Type>),
+ Struct(HashMap<String, Type>),
Fn(Box<FuncType>),
}
@@ -60,19 +60,21 @@ impl Type {
Box::new(self_inner.unify(*other_inner, coerce)?),
ArrayLen::unify(self_len, other_len, coerce)?,
),
- (Map(self_entries), Map(mut other_entries)) => {
+ (Struct(self_entries), Struct(mut other_entries)) => {
if self_entries.len() != other_entries.len() {
return Err(TypeError);
}
- Map(self_entries
- .into_iter()
- .map(|(k, v)| {
- let Some(v2) = other_entries.remove(&k) else {
- return Err(TypeError);
- };
- Ok((k, v.unify(v2, coerce)?))
- })
- .collect::<Result<_>>()?)
+ Struct(
+ self_entries
+ .into_iter()
+ .map(|(k, v)| {
+ let Some(v2) = other_entries.remove(&k) else {
+ return Err(TypeError);
+ };
+ Ok((k, v.unify(v2, coerce)?))
+ })
+ .collect::<Result<_>>()?,
+ )
}
_ => return Err(TypeError),
})
@@ -247,7 +249,7 @@ impl Type {
let index: usize = name.parse().or(Err(TypeError))?;
elems.into_iter().nth(index).ok_or(TypeError)?
}
- Map(mut entries) => entries.remove(name).ok_or(TypeError)?,
+ Struct(mut entries) => entries.remove(name).ok_or(TypeError)?,
_ => return Err(TypeError),
})
}
@@ -308,12 +310,14 @@ impl Type {
})?),
ArrayLen::Fixed(elems.len()),
),
- Literal::Map(entries) => Map(entries
- .iter()
- .map(|ast::MapEntry { key, value }| {
- Ok(((*key).to_owned(), Self::ast_expr_type(ctx, value)?))
- })
- .collect::<Result<_>>()?),
+ Literal::Struct(entries) => Struct(
+ entries
+ .iter()
+ .map(|ast::StructField { key, value }| {
+ Ok(((*key).to_owned(), Self::ast_expr_type(ctx, value)?))
+ })
+ .collect::<Result<_>>()?,
+ ),
})
}
}
@@ -342,7 +346,7 @@ impl Display for Type {
f.write_str(")")
}
Type::Array(typ, len) => write!(f, "[{typ}{len}]"),
- Type::Map(entries) => {
+ Type::Struct(entries) => {
let mut first = true;
f.write_str("{")?;
for (key, typ) in entries {