Coverage Report

Created: 2025-07-01 06:18

/src/WasmEdge/include/po/argument_parser.h
Line
Count
Source (jump to first uncovered line)
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: 2019-2024 Second State INC
3
4
//===-- wasmedge/po/argument_parser.h - Argument parser -------------------===//
5
//
6
// Part of the WasmEdge Project.
7
//
8
//===----------------------------------------------------------------------===//
9
#pragma once
10
11
#include "common/defines.h"
12
#include "common/errcode.h"
13
#include "common/hash.h"
14
#include "common/span.h"
15
#include "po/error.h"
16
#include "po/list.h"
17
#include "po/option.h"
18
#include "po/subcommand.h"
19
20
#include <functional>
21
#include <memory>
22
#include <string>
23
#include <string_view>
24
#include <unordered_map>
25
#include <utility>
26
#include <vector>
27
28
namespace WasmEdge {
29
namespace PO {
30
31
using namespace std::literals;
32
class ArgumentParser {
33
private:
34
  class ArgumentDescriptor {
35
  public:
36
    template <typename T>
37
    ArgumentDescriptor(T &Opt) noexcept
38
0
        : Desc(Opt.description()), Meta(Opt.meta()), MinNArgs(Opt.min_narg()),
39
0
          MaxNArgs(Opt.max_narg()), Argument([&Opt](std::string Arg) {
40
0
            return Opt.argument(std::move(Arg));
41
0
          }),
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> > >(WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> > >(WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> > >(WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> > >(WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> > >(WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> > >(WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> > >(WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> > >(WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> > >(WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> > >(WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> > >(WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> > >(WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> > >(WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> > >(WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> > >(WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const
42
0
          DefaultValue([&Opt]() { Opt.default_argument(); }),
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> > >(WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> > >(WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> > >(WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> > >(WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> > >(WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> > >(WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> > >(WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> > >(WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> > >(WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> > >(WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> > >(WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> > >(WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> > >(WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> > >(WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> >&)::{lambda()#1}::operator()() const
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> > >(WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> >&)::{lambda()#1}::operator()() const
43
0
          Hidden(Opt.hidden()), Store(&Opt.value()) {}
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> > >(WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> > >(WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> > >(WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> > >(WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> > >(WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> > >(WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> > >(WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> > >(WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> > >(WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> > >(WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> > >(WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> > >(WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> > >(WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> > >(WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser::ArgumentDescriptor::ArgumentDescriptor<WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> > >(WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> >&)
44
0
    auto &nargs() noexcept { return NArgs; }
45
0
    auto &nargs() const noexcept { return NArgs; }
46
0
    auto &options() noexcept { return Options; }
47
0
    auto &options() const noexcept { return Options; }
48
49
0
    auto &description() const noexcept { return Desc; }
50
0
    auto &meta() const noexcept { return Meta; }
51
0
    auto &hidden() const noexcept { return Hidden; }
52
0
    auto &min_nargs() const noexcept { return MinNArgs; }
53
0
    auto &max_nargs() const noexcept { return MaxNArgs; }
54
0
    cxx20::expected<void, Error> argument(std::string Arg) const noexcept {
55
0
      return Argument(std::move(Arg));
56
0
    }
57
0
    void default_value() const noexcept { DefaultValue(); }
58
0
    template <typename T> void raw_value(T Value) const noexcept {
59
0
      *static_cast<T *>(Store) = Value;
60
0
    }
61
62
  private:
63
    std::string_view Desc;
64
    std::string_view Meta;
65
    std::size_t NArgs = 0;
66
    std::size_t MinNArgs;
67
    std::size_t MaxNArgs;
68
    std::vector<std::string_view> Options;
69
    std::function<cxx20::expected<void, Error>(std::string)> Argument;
70
    std::function<void()> DefaultValue;
71
    bool Hidden;
72
    void *Store;
73
  };
74
75
  class SubCommandDescriptor {
76
  public:
77
    SubCommandDescriptor() noexcept
78
0
        : HelpOpt(std::make_unique<Option<Toggle>>(
79
0
              Description("Show this help messages"sv))) {
80
0
      add_option("h"sv, *HelpOpt);
81
0
      add_option("help"sv, *HelpOpt);
82
0
    }
83
0
    SubCommandDescriptor(SubCommand &SC) noexcept : SubCommandDescriptor() {
84
0
      this->SC = &SC;
85
0
    }
86
87
    template <typename... ArgsT>
88
0
    void add_child(SubCommandDescriptor &Child, ArgsT &&...Args) noexcept {
89
0
      const size_t Offset = static_cast<size_t>(&Child - this);
90
0
      SubCommandList.push_back(Offset);
91
0
      (Child.SubCommandNames.push_back(Args), ...);
92
0
      (SubCommandMap.emplace(std::forward<ArgsT>(Args), Offset), ...);
93
0
    }
94
95
    template <typename T>
96
0
    void add_option(std::string_view Argument, T &Opt) noexcept {
97
0
      if (auto Iter = OptionMap.find(std::addressof(Opt));
98
0
          Iter == OptionMap.end()) {
99
0
        OptionMap.emplace(std::addressof(Opt), ArgumentDescriptors.size());
100
0
        ArgumentMap.emplace(Argument, ArgumentDescriptors.size());
101
0
        NonpositionalList.push_back(ArgumentDescriptors.size());
102
0
        ArgumentDescriptors.emplace_back(Opt);
103
0
        ArgumentDescriptors.back().options().push_back(Argument);
104
0
      } else {
105
0
        ArgumentMap.emplace(Argument, Iter->second);
106
0
        ArgumentDescriptors[Iter->second].options().push_back(Argument);
107
0
      }
108
0
    }
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> >&)
109
110
0
    template <typename T> void add_option(T &Opt) noexcept {
111
0
      if (auto Iter = OptionMap.find(std::addressof(Opt));
112
0
          Iter == OptionMap.end()) {
113
0
        OptionMap.emplace(std::addressof(Opt), ArgumentDescriptors.size());
114
0
        PositionalList.emplace_back(ArgumentDescriptors.size());
115
0
        ArgumentDescriptors.emplace_back(Opt);
116
0
      } else {
117
0
        PositionalList.emplace_back(Iter->second);
118
0
      }
119
0
    }
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: void WasmEdge::PO::ArgumentParser::SubCommandDescriptor::add_option<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
120
121
0
    bool set_raw_value(std::string_view Option) const noexcept {
122
0
      auto Iter = ArgumentMap.find(Option);
123
0
      if (Iter == ArgumentMap.end()) {
124
0
        return false;
125
0
      }
126
0
      const ArgumentDescriptor &CurrentDesc = ArgumentDescriptors[Iter->second];
127
0
      if (CurrentDesc.max_nargs() != 0) {
128
0
        return false;
129
0
      }
130
131
0
      CurrentDesc.default_value();
132
0
      return true;
133
0
    }
134
135
    template <typename T>
136
0
    bool set_raw_value(std::string_view Option, T Value) const noexcept {
137
0
      auto Iter = ArgumentMap.find(Option);
138
0
      if (Iter == ArgumentMap.end()) {
139
0
        return false;
140
0
      }
141
0
      const ArgumentDescriptor &CurrentDesc = ArgumentDescriptors[Iter->second];
142
0
      if (CurrentDesc.max_nargs() == 0) {
143
0
        return false;
144
0
      }
145
146
0
      CurrentDesc.raw_value(Value);
147
0
      return true;
148
0
    }
149
150
    cxx20::expected<bool, Error> parse(std::FILE *Out,
151
                                       Span<const char *> ProgramNamePrefix,
152
                                       int Argc, const char *Argv[], int ArgP,
153
                                       const bool &VersionOpt) noexcept;
154
155
    void usage(std::FILE *Out) const noexcept;
156
157
    void help(std::FILE *Out) const noexcept;
158
159
    void indent_output(std::FILE *Out, const std::string_view kIndent,
160
                       std::size_t IndentCount, std::size_t ScreenWidth,
161
                       std::string_view Desc) const noexcept;
162
0
    bool isHelp() const noexcept { return HelpOpt->value(); }
163
164
  private:
165
    cxx20::expected<ArgumentDescriptor *, Error>
166
    consume_short_options(std::string_view Arg) noexcept;
167
168
    cxx20::expected<ArgumentDescriptor *, Error>
169
    consume_long_option_with_argument(std::string_view Arg) noexcept;
170
171
    cxx20::expected<ArgumentDescriptor *, Error>
172
    consume_short_option(std::string_view Option) noexcept;
173
174
    cxx20::expected<ArgumentDescriptor *, Error>
175
    consume_long_option(std::string_view Option) noexcept;
176
177
    cxx20::expected<ArgumentDescriptor *, Error>
178
    consume_argument(ArgumentDescriptor &CurrentDesc,
179
                     std::string_view Argument) noexcept;
180
181
    SubCommand *SC = nullptr;
182
    std::vector<std::string_view> SubCommandNames;
183
    std::vector<const char *> ProgramNames;
184
    std::vector<ArgumentDescriptor> ArgumentDescriptors;
185
    std::unordered_map<void *, std::size_t> OptionMap;
186
    std::unordered_map<std::string_view, std::size_t, Hash::Hash> ArgumentMap;
187
    std::unordered_map<std::string_view, std::size_t, Hash::Hash> SubCommandMap;
188
    std::vector<std::size_t> SubCommandList;
189
    std::vector<std::size_t> NonpositionalList;
190
    std::vector<std::size_t> PositionalList;
191
    std::unique_ptr<Option<Toggle>> HelpOpt;
192
193
#if WASMEDGE_OS_WINDOWS
194
    // Native PowerShell failed to display yellow, so we use bright yellow.
195
    static inline constexpr std::string_view YELLOW_COLOR = "\x1b[93m"sv;
196
#else
197
    static inline constexpr std::string_view YELLOW_COLOR = "\x1b[33m"sv;
198
#endif
199
    static inline constexpr std::string_view GREEN_COLOR = "\x1b[32m";
200
    static inline constexpr std::string_view RESET_COLOR = "\x1b[0m";
201
  };
202
203
public:
204
  ArgumentParser() noexcept
205
0
      : SubCommandDescriptors(1), CurrentSubCommandId(0),
206
0
        VerOpt(Description("Show version information"sv)) {
207
0
    SubCommandDescriptors.front().add_option("v"sv, VerOpt);
208
0
    SubCommandDescriptors.front().add_option("version"sv, VerOpt);
209
0
  }
210
211
  template <typename T>
212
0
  ArgumentParser &add_option(std::string_view Argument, T &Opt) noexcept {
213
0
    SubCommandDescriptors[CurrentSubCommandId].add_option(Argument, Opt);
214
0
    return *this;
215
0
  }
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<WasmEdge::PO::Toggle, WasmEdge::PO::Parser<bool> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned long, WasmEdge::PO::Parser<unsigned long> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::List<int, WasmEdge::PO::Parser<int> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<WasmEdge::PO::Toggle*, WasmEdge::PO::Parser<bool> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<signed char*, WasmEdge::PO::Parser<signed char> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<short*, WasmEdge::PO::Parser<short> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<int*, WasmEdge::PO::Parser<int> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<long*, WasmEdge::PO::Parser<long> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned char*, WasmEdge::PO::Parser<unsigned char> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned short*, WasmEdge::PO::Parser<unsigned short> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned int*, WasmEdge::PO::Parser<unsigned int> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<unsigned long*, WasmEdge::PO::Parser<unsigned long> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<float*, WasmEdge::PO::Parser<float> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<double*, WasmEdge::PO::Parser<double> >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, WasmEdge::PO::Option<WasmEdge_String*, WasmEdge::PO::Parser<WasmEdge_String> >&)
216
217
0
  template <typename T> ArgumentParser &add_option(T &Opt) noexcept {
218
0
    SubCommandDescriptors[CurrentSubCommandId].add_option(Opt);
219
0
    return *this;
220
0
  }
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
Unexecuted instantiation: WasmEdge::PO::ArgumentParser& WasmEdge::PO::ArgumentParser::add_option<WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(WasmEdge::PO::List<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::PO::Parser<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)
221
222
0
  bool set_raw_value(std::string_view Option) const noexcept {
223
0
    return SubCommandDescriptors[CurrentSubCommandId].set_raw_value(Option);
224
0
  }
225
226
  template <typename T>
227
0
  bool set_raw_value(std::string_view Option, T Value) const noexcept {
228
0
    return SubCommandDescriptors[CurrentSubCommandId].set_raw_value(Option,
229
0
                                                                    Value);
230
0
  }
231
232
  template <typename... ArgsT>
233
0
  ArgumentParser &begin_subcommand(SubCommand &SC, ArgsT &&...Args) noexcept {
234
0
    SubCommandStack.push_back(CurrentSubCommandId);
235
0
    const auto ParentSubCommandId =
236
0
        std::exchange(CurrentSubCommandId, SubCommandDescriptors.size());
237
0
    SubCommandDescriptors.emplace_back(SC);
238
0
    SubCommandDescriptors[ParentSubCommandId].add_child(
239
0
        SubCommandDescriptors[CurrentSubCommandId],
240
0
        std::forward<ArgsT>(Args)...);
241
0
    return *this;
242
0
  }
243
244
0
  ArgumentParser &end_subcommand() noexcept {
245
0
    CurrentSubCommandId = SubCommandStack.back();
246
0
    SubCommandStack.pop_back();
247
0
    return *this;
248
0
  }
249
250
  bool parse(std::FILE *Out, int Argc, const char *Argv[]) noexcept;
251
252
0
  void usage(std::FILE *Out) const noexcept {
253
0
    SubCommandDescriptors.front().usage(Out);
254
0
  }
255
0
  void help(std::FILE *Out) const noexcept {
256
0
    SubCommandDescriptors.front().help(Out);
257
0
  }
258
0
  bool isVersion() const noexcept { return VerOpt.value(); }
259
0
  bool isHelp() const noexcept {
260
0
    bool is_help_select = false;
261
0
    for (const auto &iter : SubCommandDescriptors) {
262
0
      is_help_select |= iter.isHelp();
263
0
    }
264
0
    return is_help_select;
265
0
  }
266
267
private:
268
  std::vector<SubCommandDescriptor> SubCommandDescriptors;
269
  std::size_t CurrentSubCommandId;
270
  std::vector<std::size_t> SubCommandStack;
271
  Option<Toggle> VerOpt;
272
};
273
274
} // namespace PO
275
} // namespace WasmEdge