use polars_error::{PolarsResult, polars_bail};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub trait CompressionLevel<T: std::fmt::Display + std::cmp::PartialOrd> {
const MINIMUM_LEVEL: T;
const MAXIMUM_LEVEL: T;
fn is_valid_level(level: T) -> PolarsResult<()> {
let compression_range = Self::MINIMUM_LEVEL..=Self::MAXIMUM_LEVEL;
if compression_range.contains(&level) {
Ok(())
} else {
polars_bail!(InvalidOperation: "valid compression range {}..={} exceeded.",
compression_range.start(),
compression_range.end()
)
}
}
}
#[derive(Debug, Eq, PartialEq, Hash, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]
pub struct BrotliLevel(u32);
impl Default for BrotliLevel {
fn default() -> Self {
Self(1)
}
}
impl CompressionLevel<u32> for BrotliLevel {
const MINIMUM_LEVEL: u32 = 0;
const MAXIMUM_LEVEL: u32 = 11;
}
impl BrotliLevel {
pub fn try_new(level: u32) -> PolarsResult<Self> {
Self::is_valid_level(level).map(|_| Self(level))
}
pub fn compression_level(&self) -> u32 {
self.0
}
}
#[derive(Debug, Eq, PartialEq, Hash, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]
pub struct GzipLevel(u8);
impl Default for GzipLevel {
fn default() -> Self {
Self(6)
}
}
impl CompressionLevel<u8> for GzipLevel {
const MINIMUM_LEVEL: u8 = 0;
const MAXIMUM_LEVEL: u8 = 9;
}
impl GzipLevel {
pub fn try_new(level: u8) -> PolarsResult<Self> {
Self::is_valid_level(level).map(|_| Self(level))
}
pub fn compression_level(&self) -> u8 {
self.0
}
}
#[derive(Debug, Eq, PartialEq, Hash, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]
pub struct ZstdLevel(i32);
impl CompressionLevel<i32> for ZstdLevel {
const MINIMUM_LEVEL: i32 = 1;
const MAXIMUM_LEVEL: i32 = 22;
}
impl ZstdLevel {
pub fn try_new(level: i32) -> PolarsResult<Self> {
Self::is_valid_level(level).map(|_| Self(level))
}
pub fn compression_level(&self) -> i32 {
self.0
}
}
impl Default for ZstdLevel {
fn default() -> Self {
Self(3)
}
}