rl_model/model/
effect.rs

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