A fork of mtelver's day10 project
1type parent_layer_paths = { parentLayerPaths : string list [@key "parentLayerPaths"] } [@@deriving yojson]
2
3type layer = {
4 type_ : string;
5 source : string;
6 target : string;
7 options : parent_layer_paths list;
8}
9
10type raw_layer = {
11 raw_type_ : string; [@key "Type"]
12 raw_source : string; [@key "Source"]
13 raw_target : string; [@key "Target"]
14 raw_options : string list; [@key "Options"]
15}
16[@@deriving yojson]
17
18let parse_option_string str =
19 if String.starts_with ~prefix:"parentLayerPaths=" str then
20 try
21 let json_part = String.sub str 17 (String.length str - 17) in
22 let full_json = "{\"parentLayerPaths\":" ^ json_part ^ "}" in
23 Yojson.Safe.from_string full_json |> parent_layer_paths_of_yojson |> Result.to_option
24 with
25 | _ -> None
26 else None
27
28let layer_of_raw (raw_layer : raw_layer) =
29 {
30 type_ = raw_layer.raw_type_;
31 source = raw_layer.raw_source;
32 target = raw_layer.raw_target;
33 options = List.filter_map parse_option_string raw_layer.raw_options;
34 }
35
36let layers_of_yojson json =
37 match [%of_yojson: raw_layer list] json with
38 | Ok raw_layers -> Ok (List.map layer_of_raw raw_layers)
39 | Error e -> Error e
40
41let parse_layers json_string =
42 let json = Yojson.Safe.from_string json_string in
43 layers_of_yojson json
44
45let read_layers path =
46 let mounts = Os.read_from_file path in
47 match parse_layers mounts with
48 | Ok layers ->
49 (layers |> List.map (fun l -> List.map (fun x -> x.parentLayerPaths) l.options) |> List.flatten |> List.flatten) @ List.map (fun l -> l.source) layers
50 | Error _ -> []