1use crate::Position;
2
3use std::fmt;
4
5#[derive(Clone, Debug, Eq, PartialEq)]
6pub enum Transition {
7 None,
8 FadeToWhite,
9 FadeToBlack,
10 Wave,
11 Tunnel,
12 SlideUp,
13 SlideDown,
14 SlideLeft,
15 SlideRight,
16}
17
18impl Transition {
19 pub fn from_str(str: &str) -> Result<Transition, crate::Error> {
20 match str {
21 "fade_w" => Ok(Transition::FadeToWhite),
22 "fade_b" => Ok(Transition::FadeToBlack),
23 "wave" => Ok(Transition::Wave),
24 "tunnel" => Ok(Transition::Tunnel),
25 "slide_u" => Ok(Transition::SlideUp),
26 "slide_d" => Ok(Transition::SlideDown),
27 "slide_l" => Ok(Transition::SlideLeft),
28 "slide_r" => Ok(Transition::SlideRight),
29 _ => Err(crate::Error::Transition),
30 }
31 }
32}
33
34impl fmt::Display for Transition {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36 write!(f, "{}", match &self {
37 Transition::FadeToWhite => " FX fade_w",
38 Transition::FadeToBlack => " FX fade_b",
39 Transition::Wave => " FX wave",
40 Transition::Tunnel => " FX tunnel",
41 Transition::SlideUp => " FX slide_u",
42 Transition::SlideDown => " FX slide_d",
43 Transition::SlideLeft => " FX slide_l",
44 Transition::SlideRight => " FX slide_r",
45 Transition::None => "",
46 })
47 }
48}
49
50#[derive(Clone, Debug, Eq, PartialEq)]
51pub struct Exit {
52 pub room_id: String,
54 pub position: Position,
56 pub effect: Transition,
57}
58
59impl Exit {
60 pub fn from_str(s: &str) -> Result<Self, crate::Error> {
61 let parts: Vec<&str> = s.split_whitespace().collect();
62
63 if parts.len() < 2 {
64 return Err(crate::Error::Exit);
65 }
66
67 let mut parts = parts.iter();
68
69 let room_id = parts.next().unwrap().to_string();
70 let position = Position::from_str(parts.next().unwrap())?;
71
72 let effect = if parts.next().is_some() {
73 Transition::from_str(parts.next().unwrap())?
74 } else {
75 Transition::None
76 };
77
78 Ok(Exit { room_id, position, effect })
79 }
80}
81
82impl fmt::Display for Exit {
83 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
84 write!(
85 f,
86 "{} {}{}",
87 self.room_id,
88 self.position.to_string(),
89 self.effect.to_string()
90 )
91 }
92}
93
94#[cfg(test)]
95mod test {
96 use crate::{Transition, Exit, Position};
97
98 #[test]
99 fn exit_from_string() {
100 assert_eq!(
101 Exit::from_str("a 12,13").unwrap(),
102 Exit {
103 room_id: "a".to_string(),
104 position: Position { x: 12, y: 13 },
105 effect: Transition::None
106 }
107 );
108 }
109
110 #[test]
111 fn exit_from_string_with_fx() {
112 assert_eq!(
113 Exit::from_str("a 12,13 FX slide_u").unwrap(),
114 Exit {
115 room_id: "a".to_string(),
116 position: Position { x: 12, y: 13 },
117 effect: Transition::SlideUp
118 }
119 );
120 }
121
122 #[test]
123 fn exit_to_string() {
124 assert_eq!(
125 Exit {
126 room_id: "8".to_string(),
127 position: Position { x: 5, y: 6 },
128 effect: Transition::None
129 }.to_string(),
130 "8 5,6".to_string()
131 );
132 }
133
134 #[test]
135 fn exit_to_string_with_fx() {
136 assert_eq!(
137 Exit {
138 room_id: "8".to_string(),
139 position: Position { x: 5, y: 6 },
140 effect: Transition::FadeToWhite
141 }.to_string(),
142 "8 5,6 FX fade_w".to_string()
143 );
144 }
145}