123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2020 Nomadic Labs <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)moduleMake(Error:sigtypeerror=..includeSig.COREwithtypeerror:=errorend)(Trace:Sig.TRACE)(Monad:Tezos_lwt_result_stdlib.Lwtreslib.TRACED_MONADwithtype'errortrace:='errorTrace.trace):Sig.MONAD_EXTENSIONwithtypeerror:=Error.errorandtype'errortrace:='errorTrace.trace=struct(* we default to exposing the combined monad syntax everywhere.
We do the bulk of this by including [Lwt_traced_result_syntax] directly. *)includeMonad.Lwt_traced_result_syntax(* Some globals that Lwtreslib does not expose but that the Tezos code uses a
lot. *)let(>>=)=Monad.Lwt_syntax.(let*)let(>|=)=Monad.Lwt_syntax.(let+)let(>>?)=Monad.Result_syntax.(let*)let(>|?)=Monad.Result_syntax.(let+)letok=Monad.Result_syntax.returnleterror=Monad.Traced_result_syntax.faillet(>>=?)=Monad.Lwt_result_syntax.(let*)let(>|=?)=Monad.Lwt_result_syntax.(let+)let(>>?=)=Monad.Lwt_result_syntax.(let*?)let(>|?=)rf=matchrwithError_ase->Lwt.returne|Oko->Lwt_result.ok(fo)(* default (traced-everywhere) helper types *)typetztrace=Error.errorTrace.tracetype'atzresult=('a,tztrace)resultlettrace_encoding=Trace.encodingError.error_encodingletresult_encodinga_encoding=letopenData_encodinginlettrace_encoding=obj1(req"error"trace_encoding)inleta_encoding=obj1(req"result"a_encoding)inunion~tag_size:`Uint8[case(Tag0)a_encoding~title:"Ok"(functionOkx->Somex|_->None)(functionres->Okres);case(Tag1)trace_encoding~title:"Error"(functionErrorx->Somex|_->None)(functionx->Errorx);]letpp_print_trace=Trace.pp_printError.ppletpp_print_top_error_of_trace=Trace.pp_print_topError.ppletclassify_tracetrace=Trace.fold(funce->Error_classification.combinec(Error.classify_errore))Error_classification.defaulttraceletrecord_traceerrresult=matchresultwith|Ok_asres->res|Errortrace->Error(Trace.conserrtrace)lettraceerrf=f>>=function|Errortrace->Lwt.return_error(Trace.conserrtrace)|ok->Lwt.returnokletrecord_trace_evalmk_err=function|Errortrace->leterr=mk_err()inError(Trace.conserrtrace)|ok->oklettrace_evalmk_errf=f>>=function|Errortrace->leterr=mk_err()inLwt.return_error(Trace.conserrtrace)|ok->Lwt.returnokleterror_unlesscondexn=ifcondthenMonad.Traced_result_syntax.return_unitelseerrorexnleterror_whencondexn=ifcondthenerrorexnelseMonad.Traced_result_syntax.return_unitletfail_unlesscondexn=ifcondthenreturn_unitelsefailexnletfail_whencondexn=ifcondthenfailexnelsereturn_unitletunlesscondf=ifcondthenreturn_unitelsef()letwhen_condf=ifcondthenf()elsereturn_unitletdont_waitferr_handlerexc_handler=Lwt.dont_wait(fun()->f()>>=function|Ok()->Lwt.return_unit|Errortrace->err_handlertrace;Lwt.return_unit)exc_handlerend