bitsy_parser/
exit.rs

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    /// destination
53    pub room_id: String,
54    /// id
55    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}