mcp_compressor_core/compression/
levels.rs1use crate::Error;
6use std::fmt;
7use std::str::FromStr;
8
9#[derive(Debug, Clone, PartialEq, Eq, Default)]
18pub enum CompressionLevel {
19 Low,
21 #[default]
23 Medium,
24 High,
26 Max,
28}
29
30impl fmt::Display for CompressionLevel {
31 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32 let value = match self {
33 Self::Low => "low",
34 Self::Medium => "medium",
35 Self::High => "high",
36 Self::Max => "max",
37 };
38 f.write_str(value)
39 }
40}
41
42impl FromStr for CompressionLevel {
43 type Err = Error;
44
45 fn from_str(s: &str) -> Result<Self, Self::Err> {
46 match s.trim().to_ascii_lowercase().as_str() {
47 "low" => Ok(Self::Low),
48 "medium" => Ok(Self::Medium),
49 "high" => Ok(Self::High),
50 "max" => Ok(Self::Max),
51 _ => Err(Error::UnknownCompressionLevel(s.to_string())),
52 }
53 }
54}
55
56#[cfg(test)]
61mod tests {
62 use super::*;
63
64 #[test]
68 fn parse_low() {
69 assert_eq!("low".parse::<CompressionLevel>().unwrap(), CompressionLevel::Low);
70 }
71
72 #[test]
74 fn parse_medium() {
75 assert_eq!("medium".parse::<CompressionLevel>().unwrap(), CompressionLevel::Medium);
76 }
77
78 #[test]
80 fn parse_high() {
81 assert_eq!("high".parse::<CompressionLevel>().unwrap(), CompressionLevel::High);
82 }
83
84 #[test]
86 fn parse_max() {
87 assert_eq!("max".parse::<CompressionLevel>().unwrap(), CompressionLevel::Max);
88 }
89
90 #[test]
92 fn parse_case_insensitive() {
93 assert_eq!("LOW".parse::<CompressionLevel>().unwrap(), CompressionLevel::Low);
94 assert_eq!("MEDIUM".parse::<CompressionLevel>().unwrap(), CompressionLevel::Medium);
95 assert_eq!("HIGH".parse::<CompressionLevel>().unwrap(), CompressionLevel::High);
96 assert_eq!("MAX".parse::<CompressionLevel>().unwrap(), CompressionLevel::Max);
97 assert_eq!("High".parse::<CompressionLevel>().unwrap(), CompressionLevel::High);
98 }
99
100 #[test]
102 fn parse_invalid() {
103 assert!("invalid".parse::<CompressionLevel>().is_err());
104 }
105
106 #[test]
108 fn parse_empty() {
109 assert!("".parse::<CompressionLevel>().is_err());
110 }
111
112 #[test]
116 fn default_is_medium() {
117 assert_eq!(CompressionLevel::default(), CompressionLevel::Medium);
118 }
119
120 #[test]
124 fn display_round_trips() {
125 assert_eq!(CompressionLevel::Low.to_string(), "low");
126 assert_eq!(CompressionLevel::Medium.to_string(), "medium");
127 assert_eq!(CompressionLevel::High.to_string(), "high");
128 assert_eq!(CompressionLevel::Max.to_string(), "max");
129 }
130
131 #[test]
133 fn display_then_parse_is_identity() {
134 for level in [
135 CompressionLevel::Low,
136 CompressionLevel::Medium,
137 CompressionLevel::High,
138 CompressionLevel::Max,
139 ] {
140 let serialised = level.to_string();
141 let parsed: CompressionLevel = serialised.parse().unwrap();
142 assert_eq!(parsed, level);
143 }
144 }
145}