rl_model/model/
variable.rs1use 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 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}