exception Version_Not_Installed(string); /** Parse a local version, including lts and aliases */ let getVersion = version => { let%lwt parsed = Versions.parse(version); let%lwt resultWithLts = switch (parsed) { | Ok(x) => Lwt.return_ok(x) | Error("latest-*") => switch%lwt (VersionListingLts.getLatest()) { | Error(_) => Lwt.return_error(Version_Not_Installed(version)) | Ok({VersionListingLts.lts, _}) => Versions.Alias("latest-" ++ lts) |> Lwt.return_ok } | _ => Version_Not_Installed(version) |> Lwt.return_error }; resultWithLts |> Result.fold(Lwt.fail, Lwt.return); }; /** * Get matches for all versions that match a semver partial */ let getMatchingLocalVersions = version => { open Versions.Local; let%lwt installedVersions = Versions.getInstalledVersions(); let formattedVersionName = Versions.format(version); let matchingVersions = installedVersions |> List.filter(v => Versions.isVersionFitsPrefix(formattedVersionName, v.name) || v.name == formattedVersionName || List.exists(alias => alias == formattedVersionName, v.aliases) ) |> List.sort((a, b) => - compare(a.name, b.name)); Lwt.return(matchingVersions); };