use super::compression_goal::CompressionGoal;
use crate::TileCompression;
use enumset::EnumSet;
use std::fmt::{self, Debug};
#[derive(Clone, PartialEq, Eq)]
pub struct TargetCompression {
pub compressions: EnumSet<TileCompression>,
pub compression_goal: CompressionGoal,
}
impl TargetCompression {
#[must_use]
pub fn from_set(compressions: EnumSet<TileCompression>) -> Self {
TargetCompression {
compressions,
compression_goal: CompressionGoal::UseBestCompression,
}
}
#[must_use]
pub fn from_none() -> Self {
Self::from(TileCompression::Uncompressed)
}
pub fn set_fast_compression(&mut self) {
self.compression_goal = CompressionGoal::UseFastCompression;
}
pub fn set_incompressible(&mut self) {
self.compression_goal = CompressionGoal::IsIncompressible;
}
#[must_use]
pub fn contains(&self, compression: TileCompression) -> bool {
self.compressions.contains(compression)
}
pub fn insert(&mut self, compression: TileCompression) {
self.compressions.insert(compression);
}
}
impl Debug for TargetCompression {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("TargetCompression")
.field("allowed_compressions", &self.compressions)
.field("compression_goal", &self.compression_goal)
.finish()
}
}
impl From<TileCompression> for TargetCompression {
fn from(compression: TileCompression) -> Self {
Self::from_set(EnumSet::only(compression))
}
}
impl Default for TargetCompression {
fn default() -> Self {
Self::from_set(EnumSet::all())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::TileCompression;
use enumset::EnumSet;
#[test]
fn test_from_set_default_goal() {
let set = EnumSet::only(TileCompression::Gzip);
let tc = TargetCompression::from_set(set);
assert!(tc.contains(TileCompression::Gzip));
assert_eq!(tc.compression_goal, CompressionGoal::UseBestCompression);
}
#[test]
fn test_from_single_and_contains() {
let tc = TargetCompression::from(TileCompression::Brotli);
assert!(tc.contains(TileCompression::Brotli));
assert!(!tc.contains(TileCompression::Gzip));
assert_eq!(tc.compression_goal, CompressionGoal::UseBestCompression);
}
#[test]
fn test_from_none() {
let tc = TargetCompression::from_none();
assert!(tc.contains(TileCompression::Uncompressed));
assert_eq!(tc.compressions.len(), 1);
assert_eq!(tc.compression_goal, CompressionGoal::UseBestCompression);
}
#[test]
fn test_set_fast_and_incompressible() {
let mut tc = TargetCompression::from_none();
tc.set_fast_compression();
assert_eq!(tc.compression_goal, CompressionGoal::UseFastCompression);
tc.set_incompressible();
assert_eq!(tc.compression_goal, CompressionGoal::IsIncompressible);
}
#[test]
fn test_insert() {
let mut tc = TargetCompression::from_none();
assert!(!tc.contains(TileCompression::Gzip));
tc.insert(TileCompression::Gzip);
assert!(tc.contains(TileCompression::Gzip));
}
#[test]
fn test_debug_format() {
let tc = TargetCompression::from(TileCompression::Gzip);
let s = format!("{tc:?}");
assert!(s.starts_with("TargetCompression"));
assert!(s.contains("Gzip"));
assert!(s.contains("Use Best Compression"));
}
#[test]
fn test_default() {
let tc = TargetCompression::default();
assert!(tc.contains(TileCompression::Uncompressed));
assert!(tc.contains(TileCompression::Gzip));
assert!(tc.contains(TileCompression::Brotli));
assert_eq!(tc.compression_goal, CompressionGoal::UseBestCompression);
}
}