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 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}