use std::sync::RwLock;
use once_cell::sync::Lazy;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(default))]
pub struct Config {
pub max_packet_size: usize,
#[cfg(feature = "compression")]
#[cfg_attr(docsrs, cfg(feature = "compression"))]
#[cfg_attr(feature = "serde", serde(serialize_with = "serialize_compression", deserialize_with = "deserialize_compression"))]
pub compression: flate2::Compression,
}
#[cfg(feature = "serde")]
fn serialize_compression<S: serde::Serializer>(compression: &flate2::Compression, serializer: S) -> Result<S::Ok, S::Error> {
<u32 as serde::Serialize>::serialize(&(compression.level()), serializer)
}
#[cfg(feature = "serde")]
fn deserialize_compression<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<flate2::Compression, D::Error> {
<u32 as serde::Deserialize>::deserialize(deserializer).map(|l| flate2::Compression::new(l))
}
impl Default for Config {
fn default() -> Self {
Self {
max_packet_size: 1 << 20,
#[cfg(feature = "compression")]
compression: flate2::Compression::default(),
}
}
}
static CONFIG: Lazy<RwLock<Config>> = Lazy::new(|| RwLock::new(Config::default()));
#[inline]
pub fn set_config(config: Config) {
let mut c = CONFIG.write().unwrap();
*c = config;
}
#[inline]
pub fn get_config() -> Config {
let c = CONFIG.read().unwrap();
(*c).clone()
}
#[inline]
pub fn get_max_packet_size() -> usize {
let c = CONFIG.read().unwrap();
(*c).max_packet_size
}
#[cfg(feature = "compression")]
#[cfg_attr(docsrs, cfg(feature = "compression"))]
#[inline]
pub fn get_compression() -> flate2::Compression {
let c = CONFIG.read().unwrap();
(*c).compression
}
#[cfg(test)]
mod test {
use crate::config::*;
#[test]
fn get() {
let _ = get_max_packet_size();
let _ = get_compression();
}
#[test]
fn set() {
set_config(Config { max_packet_size: 1 << 10, ..Config::default() });
assert_eq!(1 << 10, get_max_packet_size());
}
#[test]
fn set_twice() {
set_config(Config { max_packet_size: 1 << 10, ..Config::default() });
assert_eq!(1 << 10, get_max_packet_size());
set_config(Config { max_packet_size: 2 << 10, ..Config::default() });
assert_eq!(2 << 10, get_max_packet_size());
}
#[cfg(feature = "serde")]
#[test]
fn serde() {
let config = Config { max_packet_size: 1 << 10, ..Config::default() };
let serialized = serde_json::to_string(&config).unwrap();
let deserialized: Config = serde_json::from_str(&serialized).unwrap();
assert_eq!(config, deserialized);
}
}