type item = { version: string, date: string, files: list(string), lts: option(string), }; let item_of_yojson = (json: Yojson.Safe.t) => { open Yojson.Safe.Util; let version = json |> member("version") |> to_string; let files = json |> member("files") |> to_list |> List.map(to_string); let date = json |> member("date") |> to_string; let lts = Base.Option.try_with(() => json |> member("lts") |> to_string |> String.lowercase_ascii ); Ok({version, date, files, lts}); }; [@deriving of_yojson({strict: false})] type t = list(item); let parseVersionListing = body => { Base.Result.try_with(() => Yojson.Safe.from_string(body)) |> Base.Result.map_error(~f=Printexc.to_string) |> Base.Result.bind(~f=x => of_yojson(x)); }; let fromHttp = () => { let url = Config.FNM_NODE_DIST_MIRROR.get() |> Printf.sprintf("%s/index.json"); let%lwt {Http.body, _} = Http.makeRequest(url); parseVersionListing(body) |> Lwt.return; };