rl_model/model/
reference.rs

1use super::*;
2use crate::parser::Position;
3use std::collections::HashMap;
4
5#[derive(Clone, PartialEq, Eq, Hash, Debug)]
6pub enum Reference<I: Id> {
7    Unresolved(String, Option<Position>),
8    Resolved(I),
9}
10
11impl<I: Id> Reference<I> {
12    pub fn resolved(&self) -> I {
13        match self {
14            Reference::Unresolved(_, _) => panic!("reference must be resolved"),
15            Reference::Resolved(id) => *id,
16        }
17    }
18
19    pub fn resolve(&self, map: &HashMap<String, I>, info: &str) -> Result<Self, RlError> {
20        match self {
21            Reference::Unresolved(name, pos) => match map.get(name) {
22                Some(id) => Ok(Self::Resolved(*id)),
23                None => Err(RlError::Resolve {
24                    element: format!("{} '{}'", info, name),
25                    position: pos.clone(),
26                }),
27            },
28            Reference::Resolved(_) => Ok(self.clone()),
29        }
30    }
31}
32
33impl ToLang for Reference<TypeId> {
34    fn to_lang(&self, skillset: &Skillset) -> String {
35        match self {
36            Reference::Unresolved(name, _) => format!("{}/* ? */", name),
37            Reference::Resolved(id) => format!("{}", skillset.get(*id).unwrap()),
38        }
39    }
40}
41impl ToLang for Reference<ResourceId> {
42    fn to_lang(&self, skillset: &Skillset) -> String {
43        match self {
44            Reference::Unresolved(name, _) => format!("{}/* ? */", name),
45            Reference::Resolved(id) => format!("{}", skillset.get(*id).unwrap()),
46        }
47    }
48}
49
50impl ToLang for Reference<StateId> {
51    fn to_lang(&self, skillset: &Skillset) -> String {
52        match self {
53            Reference::Unresolved(name, _) => format!("{}/* ? */", name),
54            Reference::Resolved(id) => format!("{}", skillset.get(*id).unwrap()),
55        }
56    }
57}
58
59// impl ToLang for Reference<DataId> {
60//     fn to_lang(&self, skillset: &crate::Skillset) -> String {
61//         match self {
62//             Reference::Unresolved(name, _) => format!("{}/* ? */", name),
63//             Reference::Resolved(id) => format!("{}", skillset.get(*id).unwrap()),
64//         }
65//     }
66// }
67
68// impl ToLang for Reference<SkillsetId> {
69//     fn to_lang(&self, skillset: &crate::Model) -> String {
70//         match self {
71//             Reference::Unresolved(name, _) => format!("{}/* ? */", name),
72//             Reference::Resolved(id) => format!("{}", skillset.get(*id).unwrap()),
73//         }
74//     }
75// }
76
77// impl ToLang for Reference<EventId> {
78//     fn to_lang(&self, skillset: &Model) -> String {
79//         match self {
80//             Reference::Unresolved(name, _) => format!("{}/* ? */", name),
81//             Reference::Resolved(id) => format!("{}", skillset.get(*id).unwrap()),
82//         }
83//     }
84// }