1use std::sync::RwLock;
15use once_cell::sync::Lazy;
16
17#[derive(Debug, Clone, Copy, Eq, PartialEq)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(default))]
30pub struct Config {
31 pub max_packet_size: usize,
49
50 #[cfg(feature = "compression")]
66 #[cfg_attr(docsrs, cfg(feature = "compression"))]
67 #[cfg_attr(feature = "serde", serde(serialize_with = "serialize_compression", deserialize_with = "deserialize_compression"))]
68 pub compression: flate2::Compression,
69}
70
71#[cfg(feature = "serde")]
72fn serialize_compression<S: serde::Serializer>(compression: &flate2::Compression, serializer: S) -> Result<S::Ok, S::Error> {
73 <u32 as serde::Serialize>::serialize(&(compression.level()), serializer)
74}
75
76#[cfg(feature = "serde")]
77fn deserialize_compression<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<flate2::Compression, D::Error> {
78 <u32 as serde::Deserialize>::deserialize(deserializer).map(|l| flate2::Compression::new(l))
79}
80
81impl Default for Config {
82 fn default() -> Self {
83 Self {
84 max_packet_size: 1 << 20,
85 #[cfg(feature = "compression")]
86 compression: flate2::Compression::default(),
87 }
88 }
89}
90
91static CONFIG: Lazy<RwLock<Config>> = Lazy::new(|| RwLock::new(Config::default()));
92
93#[inline]
106pub fn set_config(config: Config) {
107 let mut c = CONFIG.write().unwrap();
108 *c = config;
109}
110
111#[inline]
123pub fn get_config() -> Config {
124 let c = CONFIG.read().unwrap();
125 (*c).clone()
126}
127
128#[inline]
133pub fn get_max_packet_size() -> usize {
134 let c = CONFIG.read().unwrap();
135 (*c).max_packet_size
136}
137
138#[cfg(feature = "compression")]
143#[cfg_attr(docsrs, cfg(feature = "compression"))]
144#[inline]
145pub fn get_compression() -> flate2::Compression {
146 let c = CONFIG.read().unwrap();
147 (*c).compression
148}
149
150#[cfg(test)]
151mod test {
152 use crate::config::*;
153
154 #[test]
155 fn get() {
156 let _ = get_max_packet_size();
157 let _ = get_compression();
158 }
159
160 #[test]
161 fn set() {
162 set_config(Config { max_packet_size: 1 << 10, ..Config::default() });
163 assert_eq!(1 << 10, get_max_packet_size());
164 }
165
166 #[test]
167 fn set_twice() {
168 set_config(Config { max_packet_size: 1 << 10, ..Config::default() });
169 assert_eq!(1 << 10, get_max_packet_size());
170 set_config(Config { max_packet_size: 2 << 10, ..Config::default() });
171 assert_eq!(2 << 10, get_max_packet_size());
172 }
173
174 #[cfg(feature = "serde")]
175 #[test]
176 fn serde() {
177 let config = Config { max_packet_size: 1 << 10, ..Config::default() };
178 let serialized = serde_json::to_string(&config).unwrap();
179 let deserialized: Config = serde_json::from_str(&serialized).unwrap();
180 assert_eq!(config, deserialized);
181 }
182}