123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172openError_monadletname="TEZOS_PROTOCOL"openProtocolopenTzFilename.Infixletto_file~dir:dirname?hash?env_versionmodules=letconfig_file=Data_encoding.Json.constructMeta.encoding{hash;expected_env_version=env_version;modules}inLwt_utils_unix.Json.write_file(dirname//name)config_fileletof_file~dir:dirname=letopenLwt_result_syntaxinlet*json=Lwt_utils_unix.Json.read_file(dirname//name)inreturn(Data_encoding.Json.destructMeta.encodingjson)letfind_componentdirnamemodule_name=letopenLwt_syntaxinletname_lowercase=String.uncapitalize_asciimodule_nameinletimplementation=(dirname//name_lowercase)^".ml"inletinterface=implementation^"i"inmatch(Sys.file_existsimplementation,Sys.file_existsinterface)with|false,_->Stdlib.failwith@@"No such file: "^implementation|true,false->let+implementation=Lwt_utils_unix.read_fileimplementationin{name=module_name;interface=None;implementation}|true,true->let+interface=Lwt_utils_unix.read_fileinterfaceand+implementation=Lwt_utils_unix.read_fileimplementationin{name=module_name;interface=Someinterface;implementation}letread_dirdir=letopenLwt_result_syntaxinlet*meta=of_file~dirinlet*!components=Lwt_list.map_s(find_componentdir)meta.modulesinletexpected_env=matchmeta.expected_env_versionwithNone->V0|Somev->vinreturn(meta.hash,{expected_env;components})letcreate_filesdirunits=letopenLwt_syntaxinlet*()=Lwt_utils_unix.remove_dirdirinlet*()=Lwt_utils_unix.create_dirdirinlet*files=Lwt_list.map_s(fun{name;interface;implementation}->letname=String.uncapitalize_asciinameinletml=dir//(name^".ml")inletmli=dir//(name^".mli")inlet+()=Lwt_utils_unix.create_filemlimplementationand+()=TzLwtreslib.Option.iter_s(Lwt_utils_unix.create_filemli)interfaceinmatchinterfacewithNone->[ml]|Some_->[mli;ml])unitsinletfiles=List.concatfilesinLwt.returnfilesletwrite_dirdir?hash(p:t)=letopenLwt_syntaxinlet*_files=create_filesdirp.componentsinto_file~dir?hash~env_version:p.expected_env(List.map(fun{name;_}->String.capitalize_asciiname)p.components)