1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use serde::Serialize;
use serde::Deserialize;

/// The method describes the way the image will be resized.
#[derive(Serialize, Deserialize)]
pub struct ResizeMethod(&'static str);

impl ResizeMethod {
  /// `Scales` the image down proportionally.
  pub const SCALE: &'static str = "scale";
  /// `Scales` the image down proportionally so that it `fits within` the given dimensions.
  pub const FIT: &'static str = "fit";
  /// `Scales` the image proportionally and `crops` it if necessary so that the result has exactly the given dimensions.
  pub const COVER: &'static str = "cover";
  /// A more advanced implementation of cover that also detects `cut out images` with plain backgrounds.
  pub const THUMB: &'static str = "thumb";
}

/// Use the API to create resized versions of the uploaded images.
///
/// If the `target dimensions` are larger than the original dimensions, the image will not be scaled up. Scaling up is prevented in order to protect the quality of the images.
#[derive(Serialize, Deserialize)]
pub struct Resize {
  method: String,
  pub(crate) width: Option<u32>,
  pub(crate) height: Option<u32>,
}

impl Resize {
  pub fn new<M>(
    method: M,
    width: Option<u32>,
    height: Option<u32>,
  ) -> Self
  where
    M: AsRef<str> + Into<String>,
  {
    Self {
      method: method.into(),
      width,
      height,
    }
  }
}

#[derive(Serialize, Deserialize)]
pub struct JsonData {
  pub(crate) resize: Resize,
}

impl JsonData {
  pub(crate) fn new(resize: Resize) -> Self {
    Self { 
      resize,
     }
  }
}