use crate::{from_base36, Position, ToBase36}; use std::str::FromStr; #[derive(Debug, Eq, PartialEq)] pub enum Transition { None, FadeToWhite, FadeToBlack, Wave, Tunnel, SlideUp, SlideDown, SlideLeft, SlideRight, } impl From<&str> for Transition { #[inline] fn from(str: &str) -> Transition { match str { "fade_w" => Transition::FadeToWhite, "fade_b" => Transition::FadeToBlack, "wave" => Transition::Wave, "tunnel" => Transition::Tunnel, "slide_u" => Transition::SlideUp, "slide_d" => Transition::SlideDown, "slide_l" => Transition::SlideLeft, "slide_r" => Transition::SlideRight, _ => Transition::None, } } } impl ToString for Transition { #[inline] fn to_string(&self) -> String { match &self { Transition::FadeToWhite => " FX fade_w", Transition::FadeToBlack => " FX fade_b", Transition::Wave => " FX wave", Transition::Tunnel => " FX tunnel", Transition::SlideUp => " FX slide_u", Transition::SlideDown => " FX slide_d", Transition::SlideLeft => " FX slide_l", Transition::SlideRight => " FX slide_r", Transition::None => "", } .to_string() } } #[derive(Debug, Eq, PartialEq)] pub struct Exit { /// destination pub room_id: u64, /// id pub position: Position, pub effect: Transition, } impl From for Exit { #[inline] fn from(string: String) -> Exit { // e.g. "EXT 6,4 0 10,12 FX fade_w" let room_position_effect: Vec<&str> = string.split_whitespace().collect(); let room_id = from_base36(room_position_effect[0]); let position = Position::from_str(room_position_effect[1]).unwrap(); let effect = if room_position_effect.len() == 4 { Transition::from(room_position_effect[3]) } else { Transition::None }; Exit { room_id, position, effect, } } } impl ToString for Exit { #[inline] fn to_string(&self) -> String { format!( "{} {}{}", self.room_id.to_base36(), self.position.to_string(), self.effect.to_string() ) } } #[cfg(test)] mod test { use crate::exit::{Transition, Exit}; use crate::position::Position; #[test] fn test_exit_from_string() { assert_eq!( Exit::from("a 12,13".to_string()), Exit { room_id: 10, position: Position { x: 12, y: 13 }, effect: Transition::None } ); } #[test] fn test_exit_from_string_with_fx() { assert_eq!( Exit::from("a 12,13 FX slide_u".to_string()), Exit { room_id: 10, position: Position { x: 12, y: 13 }, effect: Transition::SlideUp } ); } #[test] fn test_exit_to_string() { assert_eq!( Exit { room_id: 8, position: Position { x: 5, y: 6 }, effect: Transition::None } .to_string(), "8 5,6".to_string() ); } #[test] fn test_exit_to_string_with_fx() { assert_eq!( Exit { room_id: 8, position: Position { x: 5, y: 6 }, effect: Transition::FadeToWhite } .to_string(), "8 5,6 FX fade_w".to_string() ); } }