rl_model/model/
variable.rs

1use super::*;
2use crate::parser::{Position, RlError};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone)]
6pub struct Variable {
7    name: String,
8    rl_type: Reference<TypeId>,
9    position: Option<Position>,
10}
11
12impl Variable {
13    pub fn new<S: Into<String>>(
14        name: S,
15        rl_type: Reference<TypeId>,
16        position: Option<Position>,
17    ) -> Self {
18        let name = name.into();
19        Self {
20            name,
21            rl_type,
22            position,
23        }
24    }
25
26    pub fn name(&self) -> &str {
27        &self.name
28    }
29
30    pub fn rl_type(&self) -> &Reference<TypeId> {
31        &self.rl_type
32    }
33
34    pub fn set_type(&mut self, id: TypeId) {
35        self.rl_type = Reference::Resolved(id);
36    }
37
38    pub fn position(&self) -> Option<Position> {
39        self.position.clone()
40    }
41
42    //---------- Resolve ----------
43
44    pub fn resolve_type(&mut self, map: &HashMap<String, TypeId>) -> Result<(), RlError> {
45        match self.rl_type() {
46            Reference::Unresolved(name, pos) => match map.get(name) {
47                Some(id) => {
48                    self.set_type(*id);
49                    Ok(())
50                }
51                None => Err(RlError::Resolve {
52                    element: format!("type '{}'", name),
53                    position: pos.clone(),
54                }),
55            },
56            Reference::Resolved(_) => Ok(()),
57        }
58    }
59}
60
61impl ToLang for Variable {
62    fn to_lang(&self, skillset: &Skillset) -> String {
63        format!("{}: {}", self.name, self.rl_type.to_lang(skillset))
64    }
65}
66
67impl std::fmt::Display for Variable {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        write!(f, "{}", self.name)
70    }
71}