123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361(*---------------------------------------------------------------------------
Copyright (c) 2011 The cmdliner programmers. All rights reserved.
SPDX-License-Identifier: ISC
---------------------------------------------------------------------------*)letrev_comparen0n1=comparen1n0(* Invalid_argument strings **)leterr_not_opt="Option argument without name"leterr_not_pos="Positional argument with a name"(* Documentation formatting helpers *)letstrf=Printf.sprintfletdoc_quote=Cmdliner_base.quoteletdoc_alts=Cmdliner_base.alts_strletdoc_alts_enum?quotedenum=doc_alts?quoted(List.mapfstenum)letstr_of_ppppv=ppFormat.str_formatterv;Format.flush_str_formatter()(* Argument converters *)type'aparser=string->[`Okof'a|`Errorofstring]type'aprinter=Format.formatter->'a->unittype'aconv='aparser*'aprintertype'aconverter='aconvletdefault_docv="VALUE"letconv?docv(parse,print)=letparses=matchparseswithOkv->`Okv|Error(`Msge)->`Erroreinparse,printletconv'?docv(parse,print)=letparses=matchparseswithOkv->`Okv|Errore->`Erroreinparse,printletpconv?docvconv=convletconv_parser(parse,_)=funs->matchparseswith`Okv->Okv|`Errore->Error(`Msge)letconv_printer(_,print)=printletconv_docv_=default_docvleterr_invalidskind=`Msg(strf"invalid value '%s', expected %s"skind)letparser_of_kind_of_string~kindk_of_string=funs->matchk_of_stringswith|None->Error(err_invalidskind)|Somev->Okvletsome=Cmdliner_base.someletsome'=Cmdliner_base.some'(* Argument information *)typeenv=Cmdliner_info.Env.infoletenv_var=Cmdliner_info.Env.infotype'at='aCmdliner_term.ttypeinfo=Cmdliner_info.Arg.tletinfo=Cmdliner_info.Arg.v(* Arguments *)let(&)fx=fxleterre=Error(`Parsee)letparse_to_listparsers=matchparserswith|`Okv->`Ok[v]|`Error_ase->eletreport_deprecated_enveie=matchCmdliner_info.Env.info_deprecatedewith|None->()|Somemsg->letvar=Cmdliner_info.Env.info_vareinletmsg=String.concat""["environment variable ";var;": ";msg]inleterr_fmt=Cmdliner_info.Eval.err_ppfeiinCmdliner_msg.pp_errerr_fmtei~err:msglettry_enveiaparse~absent=matchCmdliner_info.Arg.envawith|None->Okabsent|Someenv->letvar=Cmdliner_info.Env.info_varenvinmatchCmdliner_info.Eval.env_vareivarwith|None->Okabsent|Somev->matchparsevwith|`Errore->err(Cmdliner_msg.err_env_parseenv~err:e)|`Okv->report_deprecated_enveienv;Okvletarg_to_args=Cmdliner_info.Arg.Set.singletonletlist_to_argsfl=letaddaccv=Cmdliner_info.Arg.Set.add(fv)accinList.fold_leftaddCmdliner_info.Arg.Set.emptylletflaga=ifCmdliner_info.Arg.is_posatheninvalid_argerr_not_optelseletconverteicl=matchCmdliner_cline.opt_argclawith|[]->try_enveiaCmdliner_base.env_bool_parse~absent:false|[_,_,None]->Oktrue|[_,f,Somev]->err(Cmdliner_msg.err_flag_valuefv)|(_,f,_)::(_,g,_)::_->err(Cmdliner_msg.err_opt_repeatedfg)inarg_to_argsa,convertletflag_alla=ifCmdliner_info.Arg.is_posatheninvalid_argerr_not_optelseleta=Cmdliner_info.Arg.make_all_optsainletconverteicl=matchCmdliner_cline.opt_argclawith|[]->try_enveia(parse_to_listCmdliner_base.env_bool_parse)~absent:[]|l->trylettruth(_,f,v)=matchvwith|None->true|Somev->failwith(Cmdliner_msg.err_flag_valuefv)inOk(List.rev_maptruthl)withFailuree->erreinarg_to_argsa,convertletvflagvl=letconvert_cl=letrecauxfv=function|(v,a)::rest->beginmatchCmdliner_cline.opt_argclawith|[]->auxfvrest|[_,f,None]->beginmatchfvwith|None->aux(Some(f,v))rest|Some(g,_)->failwith(Cmdliner_msg.err_opt_repeatedgf)end|[_,f,Somev]->failwith(Cmdliner_msg.err_flag_valuefv)|(_,f,_)::(_,g,_)::_->failwith(Cmdliner_msg.err_opt_repeatedgf)end|[]->matchfvwithNone->v|Some(_,v)->vintryOk(auxNonel)withFailuree->erreinletflag(_,a)=ifCmdliner_info.Arg.is_posatheninvalid_argerr_not_optelseainlist_to_argsflagl,convertletvflag_allvl=letconvert_cl=letrecauxacc=function|(fv,a)::rest->beginmatchCmdliner_cline.opt_argclawith|[]->auxaccrest|l->letfval(k,f,v)=matchvwith|None->(k,fv)|Somev->failwith(Cmdliner_msg.err_flag_valuefv)inaux(List.rev_append(List.rev_mapfvall)acc)restend|[]->ifacc=[]thenvelseList.rev_mapsnd(List.sortrev_compareacc)intryOk(aux[]l)withFailuree->erreinletflag(_,a)=ifCmdliner_info.Arg.is_posatheninvalid_argerr_not_optelseCmdliner_info.Arg.make_all_optsainlist_to_argsflagl,convertletparse_opt_valueparsefv=matchparsevwith|`Okv->v|`Errorerr->failwith(Cmdliner_msg.err_opt_parsef~err)letopt?vopt(parse,print)va=ifCmdliner_info.Arg.is_posatheninvalid_argerr_not_optelseletabsent=matchCmdliner_info.Arg.absentawith|Cmdliner_info.Arg.Docdasawhend<>""->a|_->Cmdliner_info.Arg.Val(lazy(str_of_ppprintv))inletkind=matchvoptwith|None->Cmdliner_info.Arg.Opt|Somedv->Cmdliner_info.Arg.Opt_vopt(str_of_ppprintdv)inleta=Cmdliner_info.Arg.make_opt~absent~kindainletconverteicl=matchCmdliner_cline.opt_argclawith|[]->try_enveiaparse~absent:v|[_,f,Somev]->(tryOk(parse_opt_valueparsefv)withFailuree->erre)|[_,f,None]->beginmatchvoptwith|None->err(Cmdliner_msg.err_opt_value_missingf)|Someoptv->Okoptvend|(_,f,_)::(_,g,_)::_->err(Cmdliner_msg.err_opt_repeatedgf)inarg_to_argsa,convertletopt_all?vopt(parse,print)va=ifCmdliner_info.Arg.is_posatheninvalid_argerr_not_optelseletabsent=matchCmdliner_info.Arg.absentawith|Cmdliner_info.Arg.Docdasawhend<>""->a|_->Cmdliner_info.Arg.Val(lazy"")inletkind=matchvoptwith|None->Cmdliner_info.Arg.Opt|Somedv->Cmdliner_info.Arg.Opt_vopt(str_of_ppprintdv)inleta=Cmdliner_info.Arg.make_opt_all~absent~kindainletconverteicl=matchCmdliner_cline.opt_argclawith|[]->try_enveia(parse_to_listparse)~absent:v|l->letparse(k,f,v)=matchvwith|Somev->(k,parse_opt_valueparsefv)|None->matchvoptwith|None->failwith(Cmdliner_msg.err_opt_value_missingf)|Somedv->(k,dv)intryOk(List.rev_mapsnd(List.sortrev_compare(List.rev_mapparsel)))with|Failuree->erreinarg_to_argsa,convert(* Positional arguments *)letparse_pos_valueparseav=matchparsevwith|`Okv->v|`Errorerr->failwith(Cmdliner_msg.err_pos_parsea~err)letpos?(rev=false)k(parse,print)va=ifCmdliner_info.Arg.is_optatheninvalid_argerr_not_poselseletabsent=matchCmdliner_info.Arg.absentawith|Cmdliner_info.Arg.Docdasawhend<>""->a|_->Cmdliner_info.Arg.Val(lazy(str_of_ppprintv))inletpos=Cmdliner_info.Arg.pos~rev~start:k~len:(Some1)inleta=Cmdliner_info.Arg.make_pos_abs~absent~posainletconverteicl=matchCmdliner_cline.pos_argclawith|[]->try_enveiaparse~absent:v|[v]->(tryOk(parse_pos_valueparseav)withFailuree->erre)|_->assertfalseinarg_to_argsa,convertletpos_listpos(parse,_)va=ifCmdliner_info.Arg.is_optatheninvalid_argerr_not_poselseleta=Cmdliner_info.Arg.make_pos~posainletconverteicl=matchCmdliner_cline.pos_argclawith|[]->try_enveia(parse_to_listparse)~absent:v|l->tryOk(List.rev(List.rev_map(parse_pos_valueparsea)l))with|Failuree->erreinarg_to_argsa,convertletall=Cmdliner_info.Arg.pos~rev:false~start:0~len:Noneletpos_allcva=pos_listallcvaletpos_left?(rev=false)k=letstart=ifrevthenk+1else0inletlen=ifrevthenNoneelseSomekinpos_list(Cmdliner_info.Arg.pos~rev~start~len)letpos_right?(rev=false)k=letstart=ifrevthen0elsek+1inletlen=ifrevthenSomekelseNoneinpos_list(Cmdliner_info.Arg.pos~rev~start~len)(* Arguments as terms *)letabsent_errorargs=letmake_reqaacc=letreq_a=Cmdliner_info.Arg.make_reqainCmdliner_info.Arg.Set.addreq_aaccinCmdliner_info.Arg.Set.foldmake_reqargsCmdliner_info.Arg.Set.emptyletvaluea=aleterr_arg_missingargs=err@@Cmdliner_msg.err_arg_missing(Cmdliner_info.Arg.Set.chooseargs)letrequired(args,convert)=letargs=absent_errorargsinletconverteicl=matchconverteiclwith|Ok(Somev)->Okv|OkNone->err_arg_missingargs|Error_ase->einargs,convertletnon_empty(al,convert)=letargs=absent_erroralinletconverteicl=matchconverteiclwith|Ok[]->err_arg_missingargs|Okl->Okl|Error_ase->einargs,convertletlast(args,convert)=letconverteicl=matchconverteiclwith|Ok[]->err_arg_missingargs|Okl->Ok(List.hd(List.revl))|Error_ase->einargs,convert(* Predefined arguments *)letman_fmts=["auto",`Auto;"pager",`Pager;"groff",`Groff;"plain",`Plain]letman_fmt_docv="FMT"letman_fmts_enum=Cmdliner_base.enumman_fmtsletman_fmts_alts=doc_alts_enumman_fmtsletman_fmts_dockind=strf"Show %s in format $(docv). The value $(docv) must be %s. \
With $(b,auto), the format is $(b,pager) or $(b,plain) whenever \
the $(b,TERM) env var is $(b,dumb) or undefined."kindman_fmts_altsletman_format=letdoc=man_fmts_doc"output"inletdocv=man_fmt_docvinvalue&optman_fmts_enum`Pager&info["man-format"]~docv~docletstdopt_version~docs=value&flag&info["version"]~docs~doc:"Show version information."letstdopt_help~docs=letdoc=man_fmts_doc"this help"inletdocv=man_fmt_docvinvalue&opt~vopt:(Some`Auto)(someman_fmts_enum)None&info["help"]~docv~docs~doc(* Predefined converters. *)letbool=Cmdliner_base.boolletchar=Cmdliner_base.charletint=Cmdliner_base.intletnativeint=Cmdliner_base.nativeintletint32=Cmdliner_base.int32letint64=Cmdliner_base.int64letfloat=Cmdliner_base.floatletstring=Cmdliner_base.stringletenum=Cmdliner_base.enumletfile=Cmdliner_base.fileletdir=Cmdliner_base.dirletnon_dir_file=Cmdliner_base.non_dir_fileletlist=Cmdliner_base.listletarray=Cmdliner_base.arrayletpair=Cmdliner_base.pairlett2=Cmdliner_base.t2lett3=Cmdliner_base.t3lett4=Cmdliner_base.t4