rl_model/model/
transition.rs

1use 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//-------------------------------------------------- Transitions --------------------------------------------------
75
76#[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}