rl_model/model/
transition.rs1use crate::parser::RlError;
2use std::collections::HashMap;
3
4use super::*;
5
6#[derive(Debug, Clone)]
7pub struct Transition {
8 src: Reference<StateId>,
9 dst: Reference<StateId>,
10}
11
12impl Transition {
13 pub fn new(src: Reference<StateId>, dst: Reference<StateId>) -> Self {
14 Self { src, dst }
15 }
16
17 pub fn src(&self) -> &Reference<StateId> {
18 &self.src
19 }
20
21 pub fn dst(&self) -> &Reference<StateId> {
22 &self.dst
23 }
24}
25
26impl Transition {
27 pub fn resolve(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
28 self.resolve_src(map)?;
29 self.resolve_dst(map)
30 }
31
32 pub fn resolve_src(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
33 match &self.src {
34 Reference::Unresolved(name, pos) => match map.get(name) {
35 Some(id) => {
36 self.src = Reference::Resolved(*id);
37 Ok(())
38 }
39 None => Err(RlError::Resolve {
40 element: format!("state '{}'", name),
41 position: pos.clone(),
42 }),
43 },
44 Reference::Resolved(_) => Ok(()),
45 }
46 }
47 pub fn resolve_dst(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
48 match &self.dst {
49 Reference::Unresolved(name, pos) => match map.get(name) {
50 Some(id) => {
51 self.dst = Reference::Resolved(*id);
52 Ok(())
53 }
54 None => Err(RlError::Resolve {
55 element: format!("state '{}'", name),
56 position: pos.clone(),
57 }),
58 },
59 Reference::Resolved(_) => Ok(()),
60 }
61 }
62}
63
64impl ToLang for Transition {
65 fn to_lang(&self, skillset: &Skillset) -> String {
66 format!(
67 "{} -> {}",
68 self.src.to_lang(skillset),
69 self.dst.to_lang(skillset)
70 )
71 }
72}
73
74#[derive(Debug, Clone)]
77pub enum Transitions {
78 All,
79 List(Vec<Transition>),
80}
81
82impl Transitions {
83 pub fn resolve(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
84 match self {
85 Transitions::All => Ok(()),
86 Transitions::List(l) => {
87 for x in l {
88 x.resolve(map)?;
89 }
90 Ok(())
91 }
92 }
93 }
94}
95
96impl ToLang for Transitions {
97 fn to_lang(&self, skillset: &Skillset) -> String {
98 match self {
99 Transitions::All => format!("\t\t\ttransition all\n"),
100 Transitions::List(l) => {
101 let mut s = String::from("\t\t\ttransition {\n");
102 for x in l {
103 s.push_str(&format!("\t\t\t\t{}\n", x.to_lang(skillset)));
104 }
105 s.push_str("\t\t\t}\n");
106 s
107 }
108 }
109 }
110}