konduto/types/events/
event_type.rs

1use crate::types::validation_errors::ValidationError;
2use serde::{Deserialize, Serialize};
3use std::fmt;
4
5/// Tipo de evento
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum EventType {
9    /// Show musical
10    Show,
11    /// Teatro
12    Theater,
13    /// Cinema
14    Movies,
15    /// Festa
16    Party,
17    /// Festival
18    Festival,
19    /// Curso
20    Course,
21    /// Esporte
22    Sports,
23    /// Corporativo
24    Corporate,
25}
26
27impl EventType {
28    /// Retorna o nome do tipo de evento em português
29    pub fn name(&self) -> &str {
30        match self {
31            EventType::Show => "Show",
32            EventType::Theater => "Teatro",
33            EventType::Movies => "Cinema",
34            EventType::Party => "Festa",
35            EventType::Festival => "Festival",
36            EventType::Course => "Curso",
37            EventType::Sports => "Esporte",
38            EventType::Corporate => "Corporativo",
39        }
40    }
41}
42
43impl fmt::Display for EventType {
44    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
45        match self {
46            EventType::Show => write!(f, "show"),
47            EventType::Theater => write!(f, "theater"),
48            EventType::Movies => write!(f, "movies"),
49            EventType::Party => write!(f, "party"),
50            EventType::Festival => write!(f, "festival"),
51            EventType::Course => write!(f, "course"),
52            EventType::Sports => write!(f, "sports"),
53            EventType::Corporate => write!(f, "corporate"),
54        }
55    }
56}
57
58impl std::str::FromStr for EventType {
59    type Err = ValidationError;
60
61    fn from_str(s: &str) -> Result<Self, Self::Err> {
62        match s.trim().to_lowercase().as_str() {
63            "show" => Ok(EventType::Show),
64            "theater" | "theatre" => Ok(EventType::Theater),
65            "movies" | "cinema" => Ok(EventType::Movies),
66            "party" => Ok(EventType::Party),
67            "festival" => Ok(EventType::Festival),
68            "course" => Ok(EventType::Course),
69            "sports" | "sport" => Ok(EventType::Sports),
70            "corporate" => Ok(EventType::Corporate),
71            _ => Err(ValidationError::InvalidFormat {
72                field: "event_type".to_string(),
73                message: format!("invalid event type: {}", s),
74            }),
75        }
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    fn test_event_type_serialization() {
85        let show = EventType::Show;
86        let json = serde_json::to_string(&show).unwrap();
87        assert_eq!(json, r#""show""#);
88
89        let theater = EventType::Theater;
90        let json = serde_json::to_string(&theater).unwrap();
91        assert_eq!(json, r#""theater""#);
92    }
93
94    #[test]
95    fn test_event_type_deserialization() {
96        let json = r#""show""#;
97        let event_type: EventType = serde_json::from_str(json).unwrap();
98        assert_eq!(event_type, EventType::Show);
99
100        let json = r#""movies""#;
101        let event_type: EventType = serde_json::from_str(json).unwrap();
102        assert_eq!(event_type, EventType::Movies);
103    }
104
105    #[test]
106    fn test_event_type_from_str() {
107        assert_eq!("show".parse::<EventType>().unwrap(), EventType::Show);
108        assert_eq!("theater".parse::<EventType>().unwrap(), EventType::Theater);
109        assert_eq!("theatre".parse::<EventType>().unwrap(), EventType::Theater);
110        assert_eq!("sports".parse::<EventType>().unwrap(), EventType::Sports);
111        assert_eq!("sport".parse::<EventType>().unwrap(), EventType::Sports);
112    }
113
114    #[test]
115    fn test_event_type_display() {
116        assert_eq!(EventType::Show.to_string(), "show");
117        assert_eq!(EventType::Theater.to_string(), "theater");
118        assert_eq!(EventType::Movies.to_string(), "movies");
119    }
120
121    #[test]
122    fn test_event_type_name() {
123        assert_eq!(EventType::Show.name(), "Show");
124        assert_eq!(EventType::Theater.name(), "Teatro");
125        assert_eq!(EventType::Movies.name(), "Cinema");
126    }
127}
128