use serde::{
Deserialize,
Serialize,
};
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
pub enum SizeConfig {
#[default]
Default,
Ratio(f64),
Fixed(usize),
}
impl SizeConfig {
pub fn source() -> Self {
Self::Default
}
pub fn resolve(
self,
source_size: usize,
) -> usize {
match self {
SizeConfig::Default => source_size,
SizeConfig::Ratio(ratio) => {
assert!(ratio >= 0.0, "Ratio must be positive: {ratio}");
((source_size as f64) * ratio) as usize
}
SizeConfig::Fixed(size) => size,
}
}
}
impl From<usize> for SizeConfig {
fn from(size: usize) -> Self {
Self::Fixed(size)
}
}
impl From<f64> for SizeConfig {
fn from(ratio: f64) -> Self {
Self::Ratio(ratio)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_size_config() {
assert_eq!(SizeConfig::default(), SizeConfig::Default);
assert_eq!(SizeConfig::from(42), SizeConfig::Fixed(42));
assert_eq!(SizeConfig::from(1.5), SizeConfig::Ratio(1.5));
assert_eq!(SizeConfig::source(), SizeConfig::Default);
assert_eq!(SizeConfig::source().resolve(50), 50);
}
}