memberlist_proto/compression/
zstd_impl.rs1use core::str::FromStr;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, derive_more::Display)]
5#[display("{}", level)]
6#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
7#[cfg_attr(feature = "serde", serde(transparent))]
8#[cfg_attr(any(feature = "arbitrary", test), derive(arbitrary::Arbitrary))]
9pub struct ZstdCompressionLevel {
10 level: i8,
11}
12
13impl Default for ZstdCompressionLevel {
14 fn default() -> Self {
15 Self::new()
16 }
17}
18
19impl ZstdCompressionLevel {
20 #[inline]
22 pub const fn new() -> Self {
23 Self { level: 3 }
24 }
25
26 #[inline]
28 pub const fn with_level(level: i8) -> Self {
29 Self { level }
30 }
31
32 #[inline]
34 pub const fn level(&self) -> i8 {
35 self.level
36 }
37}
38
39impl From<u8> for ZstdCompressionLevel {
40 fn from(value: u8) -> Self {
41 if value > 22 {
42 Self::with_level(22)
43 } else {
44 Self::with_level(value as i8)
45 }
46 }
47}
48
49impl From<i8> for ZstdCompressionLevel {
50 fn from(value: i8) -> Self {
51 if value > 22 {
52 Self::with_level(22)
53 } else if value < -99 {
54 Self::with_level(-99)
55 } else {
56 Self::with_level(value)
57 }
58 }
59}
60
61#[derive(Debug, PartialEq, Eq, Hash, Clone, thiserror::Error)]
63#[error("invalid compression level: {0}")]
64pub struct ParseZstdCompressionLevelError(String);
65
66impl FromStr for ZstdCompressionLevel {
67 type Err = ParseZstdCompressionLevelError;
68
69 fn from_str(s: &str) -> Result<Self, Self::Err> {
70 if s.is_empty() {
71 return Ok(Self::default());
72 }
73
74 super::parse_or_default::<i8, _>(s).map_err(|_| ParseZstdCompressionLevelError(s.to_string()))
75 }
76}