Coverage Report

Created: 2026-11-12 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/lib/driver/uniTool.cpp
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
3
4
#include "driver/unitool.h"
5
#include "common/spdlog.h"
6
#include "common/version.h"
7
#include "driver/compiler.h"
8
#include "driver/tool.h"
9
#include "plugin/plugin.h"
10
#include "po/argument_parser.h"
11
12
#include <cstdlib>
13
#include <string_view>
14
15
namespace WasmEdge {
16
namespace Driver {
17
18
0
int UniTool(int Argc, const char *Argv[], const ToolType ToolSelect) noexcept {
19
0
  using namespace std::literals;
20
21
0
  std::ios::sync_with_stdio(false);
22
23
0
  auto Parser = PO::ArgumentParser();
24
25
0
  PO::SubCommand ToolSubCommand(
26
0
      PO::Description("Wasmedge runtime tool subcommand"sv));
27
0
  PO::SubCommand CompilerSubCommand(
28
0
      PO::Description("Wasmedge compiler subcommand"sv));
29
0
  PO::SubCommand ParseSubCommand(
30
0
      PO::Description("Wasmedge parse tool subcommand"sv));
31
0
  PO::SubCommand InstantiateSubCommand(
32
0
      PO::Description("Wasmedge instantiate tool subcommand"sv));
33
0
  PO::SubCommand ValidateSubCommand(
34
0
      PO::Description("Wasmedge validate tool subcommand"sv));
35
0
  struct DriverToolOptions ToolOptions;
36
0
  struct DriverCompilerOptions CompilerOptions;
37
0
  struct DriverToolOptions ParseOptions;
38
0
  struct DriverToolOptions InstantiateOptions;
39
0
  struct DriverToolOptions ValidateOptions;
40
41
0
  auto AddOptions = [&](const ToolType Type) noexcept {
42
0
    switch (Type) {
43
0
    case ToolType::Tool:
44
0
      ToolOptions.addOptions(Parser);
45
0
      return true;
46
0
    case ToolType::Compiler:
47
0
      CompilerOptions.addOptions(Parser);
48
0
      return true;
49
0
    case ToolType::Parse:
50
0
      ParseOptions.addParserOptions(Parser);
51
0
      return true;
52
0
    case ToolType::Instantiate:
53
0
      InstantiateOptions.addLinkerOptions(Parser);
54
0
      return true;
55
0
    case ToolType::Validate:
56
0
      ValidateOptions.addParserOptions(Parser);
57
0
      return true;
58
0
    default:
59
0
      return false;
60
0
    }
61
0
  };
62
0
  auto AddSubCommand = [&](PO::SubCommand &SubCommand, std::string_view Name,
63
0
                           const ToolType Type) noexcept {
64
0
    Parser.begin_subcommand(SubCommand, Name);
65
0
    AddOptions(Type);
66
0
    Parser.end_subcommand();
67
0
  };
68
69
  // Construct Parser Subcommands and Options
70
0
  if (ToolSelect == ToolType::All) {
71
0
    AddOptions(ToolType::Tool);
72
0
    AddSubCommand(CompilerSubCommand, "compile"sv, ToolType::Compiler);
73
0
    AddSubCommand(ToolSubCommand, "run"sv, ToolType::Tool);
74
0
    AddSubCommand(ParseSubCommand, "parse"sv, ToolType::Parse);
75
0
    AddSubCommand(InstantiateSubCommand, "instantiate"sv,
76
0
                  ToolType::Instantiate);
77
0
    AddSubCommand(ValidateSubCommand, "validate"sv, ToolType::Validate);
78
0
  } else if (!AddOptions(ToolSelect)) {
79
0
    return EXIT_FAILURE;
80
0
  }
81
82
  // Parse
83
0
  if (!Parser.parse(stdout, Argc, Argv)) {
84
0
    return EXIT_FAILURE;
85
0
  }
86
0
  if (Parser.isVersion()) {
87
0
    fmt::print("{} version {}\n"sv, Argv[0], kVersionString);
88
0
    for (const auto &Plugin : Plugin::Plugin::plugins()) {
89
0
      auto PluginVersion = Plugin.version();
90
0
      fmt::print("{} (plugin \"{}\") version {}.{}.{}.{}\n"sv,
91
0
                 Plugin.path().string(), Plugin.name(), PluginVersion.Major,
92
0
                 PluginVersion.Minor, PluginVersion.Patch, PluginVersion.Build);
93
0
    }
94
0
    return EXIT_SUCCESS;
95
0
  }
96
0
  if (Parser.isHelp()) {
97
0
    return EXIT_SUCCESS;
98
0
  }
99
100
  // Forward Results
101
0
  ToolType Selected = ToolSelect;
102
0
  if (ToolSelect == ToolType::All) {
103
0
    if (CompilerSubCommand.is_selected()) {
104
0
      Selected = ToolType::Compiler;
105
0
    } else if (ParseSubCommand.is_selected()) {
106
0
      Selected = ToolType::Parse;
107
0
    } else if (InstantiateSubCommand.is_selected()) {
108
0
      Selected = ToolType::Instantiate;
109
0
    } else if (ValidateSubCommand.is_selected()) {
110
0
      Selected = ToolType::Validate;
111
0
    } else {
112
0
      Selected = ToolType::Tool;
113
0
    }
114
0
  }
115
0
  switch (Selected) {
116
0
  case ToolType::Compiler:
117
0
    CompilerOptions.inheritLoggingOptions(ToolOptions);
118
0
    return Compiler(CompilerOptions);
119
0
  case ToolType::Parse:
120
0
    ParseOptions.inheritGlobalOptions(ToolOptions);
121
0
    return ParseTool(ParseOptions);
122
0
  case ToolType::Instantiate:
123
0
    InstantiateOptions.inheritGlobalOptions(ToolOptions);
124
0
    return InstantiateTool(InstantiateOptions);
125
0
  case ToolType::Validate:
126
0
    ValidateOptions.inheritGlobalOptions(ToolOptions);
127
0
    return ValidateTool(ValidateOptions);
128
0
  default:
129
0
    return Tool(ToolOptions);
130
0
  }
131
0
}
132
133
} // namespace Driver
134
} // namespace WasmEdge