rl_model/model/
event.rs

1use super::*;
2use crate::parser::{Position, RlError};
3use std::collections::HashMap;
4
5#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Default)]
6pub struct EventId(pub usize);
7impl Id for EventId {
8    fn index(&self) -> usize {
9        self.0
10    }
11}
12
13#[derive(Debug, Clone)]
14pub struct Event {
15    id: EventId,
16    name: String,
17    guard: Option<Expr>,
18    effects: Vec<Effect>,
19    position: Option<Position>,
20}
21
22impl Event {
23    pub fn new<S: Into<String>>(
24        name: S,
25        guard: Option<Expr>,
26        effects: Vec<Effect>,
27        position: Option<Position>,
28    ) -> Self {
29        let id = EventId::default();
30        let name = name.into();
31        Self {
32            id,
33            name,
34            guard,
35            effects,
36            position,
37        }
38    }
39
40    pub fn guard(&self) -> &Option<Expr> {
41        &self.guard
42    }
43
44    pub fn effects(&self) -> &Vec<Effect> {
45        &self.effects
46    }
47
48    //---------- Resolve ----------
49
50    pub fn resolve_resource(&mut self, map: &HashMap<String, ResourceId>) -> Result<(), RlError> {
51        match &mut self.guard {
52            Some(e) => {
53                e.resolve_resource(map)?;
54            }
55            None => {}
56        }
57        for x in self.effects.iter_mut() {
58            x.resolve_resource(map)?;
59        }
60        Ok(())
61    }
62
63    pub fn resolve_state(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
64        match &mut self.guard {
65            Some(e) => {
66                e.resolve_state(map)?;
67            }
68            None => {}
69        }
70        for x in self.effects.iter_mut() {
71            x.resolve_state(map)?;
72        }
73        Ok(())
74    }
75}
76
77impl Named<EventId> for Event {
78    fn id(&self) -> EventId {
79        self.id
80    }
81
82    fn set_id(&mut self, id: EventId) {
83        self.id = id;
84    }
85
86    fn name(&self) -> &str {
87        &self.name
88    }
89    fn position(&self) -> Option<Position> {
90        self.position.clone()
91    }
92}
93
94impl ToLang for Event {
95    fn to_lang(&self, skillset: &Skillset) -> String {
96        let mut s = String::new();
97        s.push_str(&format!("\t\t{} {{\n", self.name));
98        // guard
99        match &self.guard {
100            Some(guard) => s.push_str(&format!("\t\t\tguard {}\n", guard.to_lang(skillset))),
101            None => {}
102        }
103        // Effects
104        if !self.effects.is_empty() {
105            s.push_str("\t\t\teffect {\n");
106            for x in self.effects.iter() {
107                s.push_str(&format!("\t\t\t\t{}\n", x.to_lang(skillset)))
108            }
109            s.push_str("\t\t\t}\n");
110        }
111        //
112        s.push_str("\t\t}\n");
113        s
114    }
115}
116
117impl std::fmt::Display for Event {
118    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119        write!(f, "{}", self.name())
120    }
121}