mech_core/
kind.rs

1use crate::*;
2
3// Kind -----------------------------------------------------------------------
4
5#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6pub enum Kind {
7  Tuple(Vec<Kind>),
8  Matrix(Box<Kind>,Vec<usize>),
9  Set(Box<Kind>,usize),
10  Map(Box<Kind>,Box<Kind>),
11  Table(Vec<Kind>,usize),
12  Record(Vec<Kind>),
13  Enum(u64),
14  Scalar(u64),
15  Atom(u64),
16  Function(Vec<Kind>,Vec<Kind>),
17  Reference(Box<Kind>),
18  Fsm(Vec<Kind>,Vec<Kind>),
19  Id,
20  Index,
21  Empty,
22  Any,
23}
24
25impl Kind {
26
27  pub fn to_value_kind(&self, functions: FunctionsRef) -> MResult<ValueKind> {
28    match self {
29      Kind::Scalar(id) => {
30        match functions.borrow().kinds.get(id).cloned() {
31          Some(val_knd) => Ok(val_knd),
32          None => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UndefinedKind(*id)}),
33        }
34      },
35      Kind::Matrix(knd,size) => {
36        let val_knd = knd.to_value_kind(functions.clone())?;
37        Ok(ValueKind::Matrix(Box::new(val_knd),size.clone()))
38      },
39      Kind::Tuple(elements) => {
40        let val_knds = elements.iter().map(|k| k.to_value_kind(functions.clone())).collect::<MResult<Vec<ValueKind>>>()?;
41        Ok(ValueKind::Tuple(val_knds))
42      }
43      Kind::Set(kind,size) => {
44        let val_knd = kind.to_value_kind(functions.clone())?;
45        Ok(ValueKind::Set(Box::new(val_knd),*size))
46      }
47      Kind::Map(keys,vals) => {
48        let key_knd = keys.to_value_kind(functions.clone())?;
49        let val_knd = vals.to_value_kind(functions.clone())?;
50        Ok(ValueKind::Map(Box::new(key_knd),Box::new(val_knd)))
51      },
52      Kind::Table(elements,size) => {
53        let val_knds = elements.iter().map(|k| k.to_value_kind(functions.clone())).collect::<MResult<Vec<ValueKind>>>()?;
54        Ok(ValueKind::Table(val_knds,*size))
55      },
56      Kind::Record(elements) => {
57        let val_knds = elements.iter().map(|k| k.to_value_kind(functions.clone())).collect::<MResult<Vec<ValueKind>>>()?;
58        Ok(ValueKind::Record(val_knds))
59      },
60      Kind::Enum(id) => Ok(ValueKind::Enum(*id)),
61      Kind::Atom(id) => Ok(ValueKind::Atom(*id)),
62      Kind::Reference(kind) => {
63        let val_knd = kind.to_value_kind(functions.clone())?;
64        Ok(ValueKind::Reference(Box::new(val_knd)))
65      },
66      Kind::Id => Ok(ValueKind::Id),
67      Kind::Index => Ok(ValueKind::Index),
68      Kind::Empty => Ok(ValueKind::Empty),
69      Kind::Any => Ok(ValueKind::Any),
70      _ => todo!(),
71    }
72  }
73}