konduto/types/events/
event_type.rs1use crate::types::validation_errors::ValidationError;
2use serde::{Deserialize, Serialize};
3use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum EventType {
9 Show,
11 Theater,
13 Movies,
15 Party,
17 Festival,
19 Course,
21 Sports,
23 Corporate,
25}
26
27impl EventType {
28 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