Generate srcset images for a variety of resolutions from OCaml
1(* Copyright (c) 2024, Anil Madhavapeddy <anil@recoil.org>
2
3 Permission to use, copy, modify, and/or distribute this software for
4 any purpose with or without fee is hereby granted, provided that the
5 above copyright notice and this permission notice appear in all
6 copies.
7
8 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
9 WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
10 WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
11 AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
13 OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
14 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 PERFORMANCE OF THIS SOFTWARE. *)
16
17module MS = Map.Make (String)
18
19type t = {
20 name : string;
21 slug : string;
22 origin : string;
23 dims : int * int;
24 variants : (int * int) MS.t;
25}
26
27let v name slug origin variants dims = { name; slug; origin; variants; dims }
28let name t = t.name
29let slug t = t.slug
30let origin t = t.origin
31let dims t = t.dims
32let variants t = t.variants
33
34(** JSON codec for dimension pairs, encoded as a 2-element array. *)
35let dims_json_t =
36 let open Jsont in
37 let dec w h = (w, h) in
38 let enc (w, h) i = if i = 0 then w else h in
39 t2 ~dec ~enc uint16
40
41let json_t =
42 let open Jsont in
43 let open Jsont.Object in
44 map ~kind:"Entry" v
45 |> mem "name" string ~enc:name
46 |> mem "slug" string ~enc:slug
47 |> mem "origin" string ~enc:origin
48 |> mem "variants" (as_string_map dims_json_t) ~enc:variants
49 |> mem "dims" dims_json_t ~enc:dims
50 |> finish
51
52let list = Jsont.list json_t
53let list_to_json entries = Jsont_bytesrw.encode_string list ~format:Jsont.Indent entries
54let list_of_json = Jsont_bytesrw.decode_string list