cersei_compression/
level.rs1use serde::{Deserialize, Serialize};
4use std::fmt;
5use std::str::FromStr;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
8#[serde(rename_all = "lowercase")]
9pub enum CompressionLevel {
10 #[default]
11 Off,
12 Minimal,
13 Aggressive,
14}
15
16impl CompressionLevel {
17 pub fn is_off(&self) -> bool {
18 matches!(self, CompressionLevel::Off)
19 }
20}
21
22impl FromStr for CompressionLevel {
23 type Err = String;
24 fn from_str(s: &str) -> Result<Self, Self::Err> {
25 match s.trim().to_ascii_lowercase().as_str() {
26 "off" | "none" | "false" | "0" => Ok(CompressionLevel::Off),
27 "on" | "min" | "minimal" | "true" | "1" => Ok(CompressionLevel::Minimal),
28 "aggr" | "aggressive" | "max" => Ok(CompressionLevel::Aggressive),
29 other => Err(format!("unknown compression level: {other:?}")),
30 }
31 }
32}
33
34impl fmt::Display for CompressionLevel {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36 match self {
37 CompressionLevel::Off => write!(f, "off"),
38 CompressionLevel::Minimal => write!(f, "minimal"),
39 CompressionLevel::Aggressive => write!(f, "aggressive"),
40 }
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn parse_aliases() {
50 assert_eq!("off".parse(), Ok(CompressionLevel::Off));
51 assert_eq!("on".parse(), Ok(CompressionLevel::Minimal));
52 assert_eq!("min".parse(), Ok(CompressionLevel::Minimal));
53 assert_eq!("aggressive".parse(), Ok(CompressionLevel::Aggressive));
54 assert_eq!("max".parse(), Ok(CompressionLevel::Aggressive));
55 assert!("bogus".parse::<CompressionLevel>().is_err());
56 }
57
58 #[test]
59 fn roundtrip_display() {
60 for lvl in [
61 CompressionLevel::Off,
62 CompressionLevel::Minimal,
63 CompressionLevel::Aggressive,
64 ] {
65 let s = lvl.to_string();
66 assert_eq!(s.parse::<CompressionLevel>().unwrap(), lvl);
67 }
68 }
69}