uml_parser/
uml_print.rs

1use {UMLToken, UMLTokens};
2use std::fmt;
3use std::ops::Deref;
4
5impl fmt::Display for UMLTokens {
6    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7        let mut tokens_str = String::new();
8
9        for token in &self.tokens {
10            tokens_str.push_str(&format!("{}", token));
11        }
12
13        write!(f, "{}", tokens_str)
14    }
15}
16
17impl fmt::Display for UMLToken {
18    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19
20        let uml_str = match *self {
21            UMLToken::StartUML => "@startuml\n".to_string(),
22
23            UMLToken::EndUML => "@enduml\n".to_string(),
24
25            UMLToken::Note {
26                ref position,
27                ref text,
28            } => format!("note {}\n{}\nend note\n", position, text),
29
30            UMLToken::Parallel { ref sequences } => {
31                let mut par_str = "par\n".to_string();
32                let mut first_loop = true;
33
34                for sequence in sequences.deref() {
35                    if !first_loop {
36                        par_str.push_str("else\n");
37                    }
38
39                    par_str.push_str(&format!("{}", sequence));
40
41                    first_loop = false;
42                }
43
44                par_str.push_str("end par\n");
45
46                par_str
47            }
48
49            UMLToken::Alt { ref sequences } => {
50                let mut par_str = "alt\n".to_string();
51                let mut first_loop = true;
52
53                for sequence in sequences.deref() {
54                    if !first_loop {
55                        par_str.push_str("else\n");
56                    }
57
58                    par_str.push_str(&format!("{}", sequence));
59
60                    first_loop = false;
61                }
62
63                par_str.push_str("end alt\n");
64
65                par_str
66            }
67
68            UMLToken::Message {
69                ref from,
70                ref to,
71                ref text,
72                ref colour,
73            } => {
74                let seperator = match *colour {
75                    Some(ref colour) => format!("-[#{}]>", colour),
76                    None => "->".to_string(),
77                };
78
79                let mut msg_str = format!("{}{}{}", from, seperator, to);
80
81                if let Some(ref text) = *text {
82                    msg_str.push_str(&format!(":{}", text))
83                }
84
85                msg_str.push_str("\n");
86
87                msg_str
88            }
89
90            UMLToken::Participant {
91                ref long_name,
92                ref short_name,
93            } => {
94                let (name1, name2) = match *long_name {
95                    Some(ref name) => (name.to_string(), Some(short_name.to_string())),
96                    None => (short_name.to_string(), None),
97                };
98
99                let mut participant_str = format!("participant {}", name1);
100
101                if name2.is_some() {
102                    participant_str.push_str(&format!(" as {}", name2.unwrap()));
103                }
104
105                participant_str.push_str("\n");
106
107                participant_str
108            }
109
110            UMLToken::Activate { ref name } => format!("activate {}\n", name),
111
112            UMLToken::Deactivate { ref name } => format!("deactivate {}\n", name),
113
114            UMLToken::Loop {
115                ref sequence,
116                ref count,
117            } => {
118                let mut loop_str = format!("loop {}\n", count);
119
120                loop_str.push_str(&format!("{}", sequence));
121
122                loop_str.push_str("end loop\n");
123
124                loop_str
125            }
126
127            UMLToken::Box {
128                ref name,
129                ref sequence,
130            } => {
131                let mut box_str = format!("box {}\n", name);
132
133                box_str.push_str(&format!("{}", sequence));
134
135                box_str.push_str("end box\n");
136
137                box_str
138            }
139
140            UMLToken::Include { ref sequence, .. } => format!("{}", sequence),
141
142            UMLToken::Destroy { ref name } => format!("destroy {}\n", name),
143
144            UMLToken::Delay { ref text } => format!("delay {}\n", text),
145        };
146
147        write!(f, "{}", uml_str)
148    }
149}