UNPKG

@elliottcable/bs-cmdliner

Version:

Cmdliner — Declarative definition of command line interfaces for OCaml

511 lines (494 loc) 14.4 kB
'use strict'; var $$Map = require("bs-platform/lib/js/map.js"); var List = require("bs-platform/lib/js/list.js"); var Block = require("bs-platform/lib/js/block.js"); var Curry = require("bs-platform/lib/js/curry.js"); var Printf = require("bs-platform/lib/js/printf.js"); var $$String = require("bs-platform/lib/js/string.js"); var Caml_obj = require("bs-platform/lib/js/caml_obj.js"); var Pervasives = require("bs-platform/lib/js/pervasives.js"); var Caml_string = require("bs-platform/lib/js/caml_string.js"); var Cmdliner_msg = require("./cmdliner_msg.bs.js"); var Cmdliner_base = require("./cmdliner_base.bs.js"); var Cmdliner_info = require("./cmdliner_info.bs.js"); var Cmdliner_trie = require("./cmdliner_trie.bs.js"); var Cmdliner_suggest = require("./cmdliner_suggest.bs.js"); var Caml_builtin_exceptions = require("bs-platform/lib/js/caml_builtin_exceptions.js"); function err_multi_opt_name_def(name, a, a$prime) { return Cmdliner_base.err_multi_def("option name", name, Cmdliner_info.arg_doc, a, a$prime); } var Amap = $$Map.Make(Cmdliner_info.Arg); function get_arg(cl, a) { try { return Curry._2(Amap[/* find */21], a, cl); } catch (exn){ if (exn === Caml_builtin_exceptions.not_found) { throw [ Caml_builtin_exceptions.assert_failure, /* tuple */[ "cmdliner_cline.ml", 29, 56 ] ]; } throw exn; } } function opt_arg(cl, a) { var match = get_arg(cl, a); if (match.tag) { throw [ Caml_builtin_exceptions.assert_failure, /* tuple */[ "cmdliner_cline.ml", 30, 59 ] ]; } else { return match[0]; } } function pos_arg(cl, a) { var match = get_arg(cl, a); if (match.tag) { return match[0]; } else { throw [ Caml_builtin_exceptions.assert_failure, /* tuple */[ "cmdliner_cline.ml", 31, 59 ] ]; } } function arg_info_indexes(args) { var _optidx = Cmdliner_trie.empty; var _posidx = /* [] */0; var _cl = Amap[/* empty */0]; var _param = Curry._1(Cmdliner_info.Args[/* elements */19], args); while(true) { var param = _param; var cl = _cl; var posidx = _posidx; var optidx = _optidx; if (param) { var l = param[1]; var a = param[0]; var match = Cmdliner_info.arg_is_pos(a); if (match) { _param = l; _cl = Curry._3(Amap[/* add */3], a, /* P */Block.__(1, [/* [] */0]), cl); _posidx = /* :: */[ a, posidx ]; continue ; } else { var add = (function(a){ return function add(t, name) { var match = Cmdliner_trie.add(t, name, a); if (match[0] >= 3901504) { return match[1]; } else { return Pervasives.invalid_arg(err_multi_opt_name_def(name, a, match[1][0])); } } }(a)); var names = Cmdliner_info.arg_opt_names(a); var optidx$1 = List.fold_left(add, optidx, names); _param = l; _cl = Curry._3(Amap[/* add */3], a, /* O */Block.__(0, [/* [] */0]), cl); _optidx = optidx$1; continue ; } } else { return /* tuple */[ optidx, posidx, cl ]; } }; } function is_opt(s) { if (s.length > 1) { return Caml_string.get(s, 0) === /* "-" */45; } else { return false; } } function is_short_opt(s) { if (s.length === 2) { return Caml_string.get(s, 0) === /* "-" */45; } else { return false; } } function parse_opt_arg(s) { var l = s.length; if (Caml_string.get(s, 1) !== /* "-" */45) { if (l === 2) { return /* tuple */[ s, undefined ]; } else { return /* tuple */[ $$String.sub(s, 0, 2), $$String.sub(s, 2, l - 2 | 0) ]; } } else { try { var i = $$String.index(s, /* "=" */61); return /* tuple */[ $$String.sub(s, 0, i), $$String.sub(s, i + 1 | 0, (l - i | 0) - 1 | 0) ]; } catch (exn){ if (exn === Caml_builtin_exceptions.not_found) { return /* tuple */[ s, undefined ]; } else { throw exn; } } } } function hint_matching_opt(optidx, s) { if (s.length <= 2) { return /* [] */0; } else { var match = Caml_string.get(s, 1) !== /* "-" */45 ? /* tuple */[ s, Curry._1(Printf.sprintf(/* Format */[ /* Char_literal */Block.__(12, [ /* "-" */45, /* String */Block.__(2, [ /* No_padding */0, /* End_of_format */0 ]) ]), "-%s" ]), s) ] : /* tuple */[ $$String.sub(s, 1, s.length - 1 | 0), s ]; var match$1 = parse_opt_arg(match[0]); var short_opt = match$1[0]; var match$2 = parse_opt_arg(match[1]); var all = Cmdliner_trie.ambiguities(optidx, "-"); var match$3 = List.mem(short_opt, all); var match$4 = Cmdliner_suggest.value(match$2[0], all); if (match$3) { if (match$4) { if (List.mem(short_opt, match$4)) { return match$4; } else { return /* :: */[ short_opt, match$4 ]; } } else { return /* :: */[ short_opt, /* [] */0 ]; } } else if (match$4) { return match$4; } else { return /* [] */0; } } } function parse_opt_args(peek_opts, optidx, cl, args) { var loop = function (_errs, _k, _cl, _pargs, _param) { while(true) { var param = _param; var pargs = _pargs; var cl = _cl; var k = _k; var errs = _errs; if (param) { var s = param[0]; if (s === "--") { return /* tuple */[ List.rev(errs), cl, List.rev_append(pargs, param[1]) ]; } else { var args = param[1]; if (is_opt(s)) { var match = parse_opt_arg(s); var value = match[1]; var name = match[0]; var match$1 = Cmdliner_trie.find(optidx, name); if (typeof match$1 === "number") { if (match$1 >= -328798100) { var ambs = Cmdliner_trie.ambiguities(optidx, name); var ambs$1 = List.sort(Caml_obj.caml_compare, ambs); var err = Cmdliner_base.err_ambiguous("option", name, ambs$1); _param = args; _k = k + 1 | 0; _errs = /* :: */[ err, errs ]; continue ; } else if (peek_opts) { _param = args; _k = k + 1 | 0; continue ; } else { var hints = hint_matching_opt(optidx, s); var err$1 = Cmdliner_base.err_unknown(hints, "option", name); _param = args; _k = k + 1 | 0; _errs = /* :: */[ err$1, errs ]; continue ; } } else { var a = match$1[1]; var match$2 = Cmdliner_info.arg_opt_kind(a); var match$3; if (value !== undefined) { match$3 = typeof match$2 === "number" && !(match$2 !== 0 || !is_short_opt(name)) ? /* tuple */[ undefined, /* :: */[ "-" + value, args ] ] : /* tuple */[ value, args ]; } else { var exit = 0; if (typeof match$2 === "number" && match$2 === 0) { match$3 = /* tuple */[ value, args ]; } else { exit = 1; } if (exit === 1) { if (args) { var v = args[0]; match$3 = is_opt(v) ? /* tuple */[ undefined, args ] : /* tuple */[ v, args[1] ]; } else { match$3 = /* tuple */[ undefined, args ]; } } } var arg = /* O */Block.__(0, [/* :: */[ /* tuple */[ k, name, match$3[0] ], opt_arg(cl, a) ]]); _param = match$3[1]; _cl = Curry._3(Amap[/* add */3], a, arg, cl); _k = k + 1 | 0; continue ; } } else { _param = args; _pargs = /* :: */[ s, pargs ]; _k = k + 1 | 0; continue ; } } } else { return /* tuple */[ List.rev(errs), cl, List.rev(pargs) ]; } }; }; var match = loop(/* [] */0, 0, cl, /* [] */0, args); var pargs = match[2]; var cl$1 = match[1]; var errs = match[0]; if (errs === /* [] */0) { return /* Ok */Block.__(0, [/* tuple */[ cl$1, pargs ]]); } else { var err = $$String.concat("\n", errs); return /* Error */Block.__(1, [/* tuple */[ err, cl$1, pargs ]]); } } function take_range(start, stop, l) { var _i = 0; var _acc = /* [] */0; var _param = l; while(true) { var param = _param; var acc = _acc; var i = _i; if (param) { var vs = param[1]; if (i < start) { _param = vs; _i = i + 1 | 0; continue ; } else if (i <= stop) { _param = vs; _acc = /* :: */[ param[0], acc ]; _i = i + 1 | 0; continue ; } else { return List.rev(acc); } } else { return List.rev(acc); } }; } function create($staropt$star, al, args) { var peek_opts = $staropt$star !== undefined ? $staropt$star : false; var match = arg_info_indexes(al); var match$1 = parse_opt_args(peek_opts, match[0], match[2], args); if (match$1.tag) { var match$2 = match$1[0]; return /* Error */Block.__(1, [/* tuple */[ match$2[0], match$2[1] ]]); } else { var match$3 = match$1[0]; var cl = match$3[0]; if (peek_opts) { return /* Ok */Block.__(0, [cl]); } else { var posidx = match[1]; var cl$1 = cl; var pargs = match$3[1]; if (pargs === /* [] */0) { var misses = List.filter(Cmdliner_info.arg_is_req)(posidx); if (misses === /* [] */0) { return /* Ok */Block.__(0, [cl$1]); } else { return /* Error */Block.__(1, [/* tuple */[ Cmdliner_msg.err_pos_misses(misses), cl$1 ]]); } } else { var last = List.length(pargs) - 1 | 0; var pos = function (rev, k) { if (rev) { return last - k | 0; } else { return k; } }; var loop = function (_misses, _cl, _max_spec, _param) { while(true) { var param = _param; var max_spec = _max_spec; var cl = _cl; var misses = _misses; if (param) { var a = param[0]; var apos = Cmdliner_info.arg_pos(a); var rev = Cmdliner_info.pos_rev(apos); var start = pos(rev, Cmdliner_info.pos_start(apos)); var match = Cmdliner_info.pos_len(apos); var stop = match !== undefined ? pos(rev, (Cmdliner_info.pos_start(apos) + match | 0) - 1 | 0) : pos(rev, last); var match$1 = rev ? /* tuple */[ stop, start ] : /* tuple */[ start, stop ]; var stop$1 = match$1[1]; var args = take_range(match$1[0], stop$1, pargs); var max_spec$1 = stop$1 > max_spec ? stop$1 : max_spec; var cl$1 = Curry._3(Amap[/* add */3], a, /* P */Block.__(1, [args]), cl); var match$2 = Cmdliner_info.arg_is_req(a) && args === /* [] */0; var misses$1 = match$2 ? /* :: */[ a, misses ] : misses; _param = param[1]; _max_spec = max_spec$1; _cl = cl$1; _misses = misses$1; continue ; } else { return /* tuple */[ misses, cl, max_spec ]; } }; }; var match$4 = loop(/* [] */0, cl$1, -1, posidx); var max_spec = match$4[2]; var cl$2 = match$4[1]; var misses$1 = match$4[0]; if (misses$1 !== /* [] */0) { return /* Error */Block.__(1, [/* tuple */[ Cmdliner_msg.err_pos_misses(misses$1), cl$2 ]]); } else if (last <= max_spec) { return /* Ok */Block.__(0, [cl$2]); } else { var excess = take_range(max_spec + 1 | 0, last, pargs); return /* Error */Block.__(1, [/* tuple */[ Cmdliner_msg.err_pos_excess(excess), cl$2 ]]); } } } } } exports.create = create; exports.opt_arg = opt_arg; exports.pos_arg = pos_arg; /* Amap Not a pure module */