A fork of mtelver's day10 project
at main 50 lines 1.6 kB view raw
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 _ -> []