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