aboutsummaryrefslogtreecommitdiff
path: root/src/cache.gleam
blob: ccba2a89cb92d5ac62221678b231b8939c3b156b (plain)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import gleam/bit_array
import gleam/dict.{type Dict}
import gleam/int
import gleam/list
import gleam/option.{type Option}
import gleam/result
import image
import simplifile
import wisp

pub type CachedImage {
  CachedImage(base64: String, info: image.ImageInformation)
}

pub type ThemeCache =
  Dict(String, Dict(Int, CachedImage))

pub fn load_themes() {
  list.fold(
    case simplifile.read_directory("./themes") {
      Ok(files) -> files
      Error(_) -> {
        wisp.log_error("Error reading themes directory")

        []
      }
    },
    dict.new(),
    fn(accumulated_themes, theme) {
      dict.insert(
        accumulated_themes,
        theme,
        list.range(0, 9)
          |> list.fold(dict.new(), fn(accumulated_digits, digit) {
            let path =
              "./themes/"
              <> theme
              <> "/"
              <> int.to_string(digit)
              <> "."
              <> case theme {
                "gelbooru-h" | "moebooru-h" | "lain" | "garukura" -> "png"
                _ -> "gif"
              }

            case simplifile.read_bits(from: path) {
              Ok(image_data) -> {
                case image.get_image_information(image_data) {
                  Ok(info) ->
                    dict.insert(
                      accumulated_digits,
                      digit,
                      CachedImage(
                        base64: bit_array.base64_encode(image_data, False),
                        info: info,
                      ),
                    )
                  Error(_) -> {
                    wisp.log_error(
                      "Error getting image information for " <> path,
                    )

                    accumulated_digits
                  }
                }
              }
              Error(_) -> {
                wisp.log_error("Error reading image file " <> path)

                accumulated_digits
              }
            }
          }),
      )
    },
  )
}

pub fn get_image(cache, theme, digit) -> Option(CachedImage) {
  dict.get(cache, theme)
  |> result.then(fn(theme_images) { dict.get(theme_images, digit) })
  |> option.from_result
}