|
|
|
exception Version_Not_Provided;
|
|
|
|
exception Conflicting_Dotfiles_Found(string, string);
|
|
|
|
|
|
|
|
let versionString = fileName => {
|
|
|
|
try%lwt(
|
|
|
|
Lwt_io.lines_of_file(fileName)
|
|
|
|
|> Lwt_stream.to_list
|
|
|
|
|> Lwt.map(List.hd)
|
|
|
|
|> Lwt.map(String.trim)
|
|
|
|
|> Lwt.map(versionString => Some(versionString))
|
|
|
|
) {
|
|
|
|
| Unix.Unix_error(Unix.ENOENT, _, _) => Lwt.return(None)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
let getVersion = () => {
|
|
|
|
let%lwt cwd = Lwt_unix.getcwd();
|
|
|
|
let%lwt nodeVersion = versionString(Filename.concat(cwd, ".node-version"))
|
|
|
|
and nvmrc = versionString(Filename.concat(cwd, ".nvmrc"));
|
|
|
|
|
|
|
|
switch (nodeVersion, nvmrc) {
|
|
|
|
| (None, None) => Lwt.fail(Version_Not_Provided)
|
|
|
|
| (Some(v1), Some(v2)) when v1 != v2 =>
|
|
|
|
Lwt.fail(Conflicting_Dotfiles_Found(v1, v2))
|
|
|
|
| (Some(version), Some(_))
|
|
|
|
| (Some(version), None)
|
|
|
|
| (None, Some(version)) => Lwt.return(version)
|
|
|
|
};
|
|
|
|
};
|