Skip to main content

mimick/library/masonry/
quality.rs

1//! Bucket selection policy for the masonry grid.
2//!
3//! Maps a `GridQuality` choice (auto / explicit) and a row's rendered height
4//! to a concrete `ThumbnailSize`. `fallback_bucket` defines the degradation
5//! chain used when a server lacks higher buckets (e.g. no fullsize).
6
7use crate::api_client::ThumbnailSize;
8
9pub(crate) const PREVIEW_BUCKET_THRESHOLD: f32 = 600.0;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
12pub enum GridQuality {
13    Auto,
14    #[default]
15    Thumbnail,
16    Preview,
17    Fullsize,
18}
19
20impl GridQuality {
21    pub fn parse(s: &str) -> Self {
22        match s {
23            "thumbnail" => Self::Thumbnail,
24            "preview" => Self::Preview,
25            "fullsize" => Self::Fullsize,
26            _ => Self::Auto,
27        }
28    }
29}
30
31pub(crate) fn bucket_for_row_height(h: f32, quality: GridQuality) -> ThumbnailSize {
32    match quality {
33        GridQuality::Thumbnail => ThumbnailSize::Thumbnail,
34        GridQuality::Preview => ThumbnailSize::Preview,
35        GridQuality::Fullsize => ThumbnailSize::Fullsize,
36        GridQuality::Auto => {
37            if h <= PREVIEW_BUCKET_THRESHOLD {
38                ThumbnailSize::Thumbnail
39            } else {
40                ThumbnailSize::Preview
41            }
42        }
43    }
44}
45
46/// Smaller size to try when a requested bucket isn't available on the server.
47pub(crate) fn fallback_bucket(size: ThumbnailSize) -> Option<ThumbnailSize> {
48    match size {
49        ThumbnailSize::Fullsize => Some(ThumbnailSize::Preview),
50        ThumbnailSize::Preview | ThumbnailSize::Thumbnail => None,
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn bucket_thumbnail_under_threshold() {
60        assert!(matches!(
61            bucket_for_row_height(200.0, GridQuality::Auto),
62            ThumbnailSize::Thumbnail
63        ));
64        assert!(matches!(
65            bucket_for_row_height(PREVIEW_BUCKET_THRESHOLD, GridQuality::Auto),
66            ThumbnailSize::Thumbnail
67        ));
68        assert!(matches!(
69            bucket_for_row_height(PREVIEW_BUCKET_THRESHOLD + 1.0, GridQuality::Auto),
70            ThumbnailSize::Preview
71        ));
72    }
73
74    #[test]
75    fn explicit_quality_overrides_row_height() {
76        assert!(matches!(
77            bucket_for_row_height(2000.0, GridQuality::Thumbnail),
78            ThumbnailSize::Thumbnail
79        ));
80        assert!(matches!(
81            bucket_for_row_height(50.0, GridQuality::Fullsize),
82            ThumbnailSize::Fullsize
83        ));
84    }
85
86    #[test]
87    fn fallback_chain_degrades_fullsize_to_preview() {
88        assert_eq!(
89            fallback_bucket(ThumbnailSize::Fullsize),
90            Some(ThumbnailSize::Preview)
91        );
92        assert_eq!(fallback_bucket(ThumbnailSize::Preview), None);
93        assert_eq!(fallback_bucket(ThumbnailSize::Thumbnail), None);
94    }
95}