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}