1use super::*;
2use crate::parser::{Position, RlError};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Default)]
6pub struct Skillset {
7 name: String,
8 types: Vec<RlType>,
9 data: Vec<Data>,
10 resources: Vec<Resource>,
11 events: Vec<Event>,
12 skills: Vec<Skill>,
13 position: Option<Position>,
14}
15
16impl Skillset {
17 pub fn new<S: Into<String>>(name: S, position: Option<Position>) -> Self {
18 let name = name.into();
19 Self {
20 name,
21 types: Default::default(),
22 data: Default::default(),
23 resources: Default::default(),
24 events: Default::default(),
25 skills: Default::default(),
26 position,
27 }
28 }
29
30 pub fn name(&self) -> &str {
31 &self.name
32 }
33
34 pub fn position(&self) -> Option<Position> {
35 self.position.clone()
36 }
37
38 pub fn types(&self) -> &Vec<RlType> {
41 &self.types
42 }
43
44 pub fn add_type(&mut self, mut rl_type: RlType) -> TypeId {
45 let id = TypeId(self.types.len());
46 rl_type.set_id(id);
47 self.types.push(rl_type);
48 id
49 }
50
51 pub fn get_type(&self, id: TypeId) -> Option<&RlType> {
52 let TypeId(index) = id;
53 self.types.get(index)
54 }
55
56 pub fn type_map(&self) -> HashMap<String, TypeId> {
57 let mut map = HashMap::new();
58 for x in self.types.iter() {
59 map.insert(x.name().into(), x.id());
60 }
61 map
62 }
63
64 pub fn data(&self) -> &Vec<Data> {
67 &self.data
68 }
69
70 pub fn get_data(&self, id: DataId) -> Option<&Data> {
71 self.data.get(id.index())
72 }
73
74 pub fn add_data(&mut self, mut data: Data) -> DataId {
75 let id = DataId(self.data.len());
76 data.set_id(id);
77 self.data.push(data);
78 id
79 }
80
81 pub fn resources(&self) -> &Vec<Resource> {
84 &self.resources
85 }
86
87 pub fn get_resource(&self, id: ResourceId) -> Option<&Resource> {
88 self.resources.get(id.index())
89 }
90
91 pub fn add_resource(&mut self, mut resource: Resource) -> ResourceId {
92 let id = ResourceId(self.resources.len());
93 resource.set_id(id);
94 self.resources.push(resource);
95 id
96 }
97
98 pub fn resource_map(&self) -> HashMap<String, ResourceId> {
99 let mut map = HashMap::new();
100 for x in self.resources.iter() {
101 map.insert(x.name().into(), x.id());
102 }
103 map
104 }
105
106 pub fn get_state(&self, id: StateId) -> Option<&State> {
109 let resource = self.get_resource(id.resource())?;
110 resource.get_state(id)
111 }
112
113 pub fn state_map(&self) -> HashMap<String, StateId> {
114 let mut map = HashMap::new();
115 for x in self.resources.iter() {
116 for y in x.states().iter() {
117 map.insert(y.name().into(), y.id());
118 }
119 }
120 map
121 }
122
123 pub fn events(&self) -> &Vec<Event> {
126 &self.events
127 }
128
129 pub fn get_event(&self, id: EventId) -> Option<&Event> {
130 self.events.get(id.index())
131 }
132
133 pub fn add_event(&mut self, mut event: Event) -> EventId {
134 let id = EventId(self.events.len());
135 event.set_id(id);
136 self.events.push(event);
137 id
138 }
139
140 pub fn skills(&self) -> &Vec<Skill> {
143 &self.skills
144 }
145
146 pub fn get_skill(&self, id: SkillId) -> Option<&Skill> {
147 self.skills.get(id.index())
148 }
149
150 pub fn add_skill(&mut self, mut skill: Skill) -> SkillId {
151 let id = SkillId(self.skills.len());
152 skill.set_id(id);
153 self.skills.push(skill);
154 id
155 }
156
157 pub fn type_naming(&self) -> Vec<Naming> {
160 self.types.iter().map(|x| x.naming()).collect()
161 }
162
163 pub fn data_naming(&self) -> Vec<Naming> {
164 self.data.iter().map(|x| x.naming()).collect()
165 }
166 pub fn resource_naming(&self) -> Vec<Naming> {
167 let mut v = Vec::new();
168 for x in self.resources.iter() {
169 v.push((x.name().into(), x.position()));
170 v.extend(x.names());
171 }
172 v
173 }
174 pub fn event_naming(&self) -> Vec<Naming> {
175 self.events.iter().map(|x| x.naming()).collect()
176 }
177 pub fn skill_naming(&self) -> Vec<Naming> {
178 self.skills.iter().map(|x| x.naming()).collect()
179 }
180
181 pub fn duplicate(&self) -> Result<(), RlError> {
182 let types = self.type_naming();
183
184 check_duplicate(
186 types
187 .clone()
188 .into_iter()
189 .chain(self.data_naming().into_iter())
190 .collect(),
191 )?;
192 check_duplicate(
194 types
195 .clone()
196 .into_iter()
197 .chain(self.resource_naming().into_iter())
198 .collect(),
199 )?;
200 check_duplicate(
202 types
203 .clone()
204 .into_iter()
205 .chain(self.event_naming().into_iter())
206 .collect(),
207 )?;
208 check_duplicate(
210 types
211 .clone()
212 .into_iter()
213 .chain(self.skill_naming().into_iter())
214 .collect(),
215 )?;
216
217 for x in self.skills.iter() {
219 x.duplicate(self)?;
220 }
221
222 Ok(())
223 }
224
225 pub fn resolve(&mut self) -> Result<(), RlError> {
228 self.resolve_type()?;
229 self.resolve_resource()?;
230 self.resolve_state()
231 }
232
233 pub fn resolve_type(&mut self) -> Result<(), RlError> {
234 let map = self.type_map();
235 for x in self.data.iter_mut() {
237 x.resolve_type(&map)?;
238 }
239 for x in self.skills.iter_mut() {
241 x.resolve_type(&map)?;
242 }
243 Ok(())
244 }
245
246 pub fn resolve_resource(&mut self) -> Result<(), RlError> {
247 let map = self.resource_map();
248 for x in self.events.iter_mut() {
250 x.resolve_resource(&map)?;
251 }
252 for x in self.skills.iter_mut() {
254 x.resolve_resource(&map)?;
255 }
256 Ok(())
257 }
258
259 pub fn resolve_state(&mut self) -> Result<(), RlError> {
260 for x in self.resources.iter_mut() {
262 x.resolve_state()?;
263 }
264 let map = self.state_map();
266 for x in self.events.iter_mut() {
267 x.resolve_state(&map)?;
268 }
269 let map = self.state_map();
271 for x in self.skills.iter_mut() {
272 x.resolve_state(&map)?;
273 }
274 Ok(())
275 }
276}
277
278impl GetFromId<TypeId, RlType> for Skillset {
281 fn get(&self, id: TypeId) -> Option<&RlType> {
282 self.get_type(id)
283 }
284}
285
286impl GetFromId<DataId, Data> for Skillset {
287 fn get(&self, id: DataId) -> Option<&Data> {
288 self.get_data(id)
289 }
290}
291impl GetFromId<ResourceId, Resource> for Skillset {
292 fn get(&self, id: ResourceId) -> Option<&Resource> {
293 self.get_resource(id)
294 }
295}
296impl GetFromId<StateId, State> for Skillset {
297 fn get(&self, id: StateId) -> Option<&State> {
298 self.get_state(id)
299 }
300}
301impl GetFromId<EventId, Event> for Skillset {
302 fn get(&self, id: EventId) -> Option<&Event> {
303 self.get_event(id)
304 }
305}
306impl GetFromId<SkillId, Skill> for Skillset {
307 fn get(&self, id: SkillId) -> Option<&Skill> {
308 self.get_skill(id)
309 }
310}
311impl GetFromId<PreconditionId, Precondition> for Skillset {
312 fn get(&self, id: PreconditionId) -> Option<&Precondition> {
313 let skill = self.get(id.skill())?;
314 skill.get(id)
315 }
316}
317impl GetFromId<InvariantId, Invariant> for Skillset {
318 fn get(&self, id: InvariantId) -> Option<&Invariant> {
319 let skill = self.get(id.skill())?;
320 skill.get(id)
321 }
322}
323impl GetFromId<SuccessId, Success> for Skillset {
324 fn get(&self, id: SuccessId) -> Option<&Success> {
325 let skill = self.get(id.skill())?;
326 skill.get(id)
327 }
328}
329impl GetFromId<FailureId, Failure> for Skillset {
330 fn get(&self, id: FailureId) -> Option<&Failure> {
331 let skill = self.get(id.skill())?;
332 skill.get(id)
333 }
334}
335
336impl std::fmt::Display for Skillset {
339 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
340 write!(f, "skillset {}", self.name)?;
341 if let Some((first, others)) = self.types.split_first() {
343 write!(f, "<{}", first.name())?;
344 for t in others {
345 write!(f, ", {}", t.name())?;
346 }
347 write!(f, ">")?;
348 }
349 write!(f, " {{\n")?;
350 if !self.data.is_empty() {
352 write!(f, "\tdata {{\n")?;
353 for x in self.data.iter() {
354 write!(f, "\t\t{}", &x.to_lang(self))?;
355 }
356 write!(f, "\t}}\n")?;
357 }
358 if !self.resources.is_empty() {
360 write!(f, "\tresource {{\n")?;
361 for x in self.resources.iter() {
362 write!(f, "{}", x.to_lang(self))?;
363 }
364 write!(f, "\t}}\n")?;
365 }
366 if !self.events.is_empty() {
368 write!(f, "\tevent {{\n")?;
369 for x in self.events.iter() {
370 write!(f, "{}", x.to_lang(self))?;
371 }
372 write!(f, "\t}}\n")?;
373 }
374 if !self.skills.is_empty() {
376 write!(f, "\tskill {{\n")?;
377 for x in self.skills.iter() {
378 write!(f, "{}", x.to_lang(self))?;
379 }
380 write!(f, "\t}}\n")?;
381 }
382 write!(f, "}}\n")?;
384 Ok(())
386 }
387}