memberlist_proto/compression/
zstd_impl.rs

1use core::str::FromStr;
2
3/// The zstd algorithm
4#[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  /// Creates a new `ZstdCompressionLevel` with the default level.
21  #[inline]
22  pub const fn new() -> Self {
23    Self { level: 3 }
24  }
25
26  /// Creates a new `ZstdCompressionLevel` with the level.
27  #[inline]
28  pub const fn with_level(level: i8) -> Self {
29    Self { level }
30  }
31
32  /// Returns the level of the zstd algorithm.
33  #[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/// An error that occurs when parsing a [`ZstdCompressionLevel`].
62#[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}