GCC Code Coverage Report


ernie/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
0 / 79
0.0%
Branches:
0 / 126
0.0%
Functions:
0 / 6
0.0%

app/main.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 /// @file main.cpp
3 /// @brief The ernie program: the viewer, and the schema and scene tools.
4 #include "ernie/app/viewer.h"
5 #include "ernie/device/device.h"
6 #include "ernie/scene/reference.h"
7 #include "ernie/util/file.h"
8 #include "ernie/util/version.h"
9
10 #include <algorithm>
11 #include <cstdio>
12 #include <exception>
13 #include <filesystem>
14 #include <stdexcept>
15 #include <string>
16 #include <string_view>
17 #include <vector>
18
19 namespace {
20
21 namespace fs = std::filesystem;
22
23 ✗ void PrintUsage() {
24 ✗ std::printf("Usage: %.*s\n"
25 " ernie --version | --devices | --help\n"
26 " ernie schema [--json-schema FILE] [--markdown DIR] [--usda DIR]\n"
27 " ernie validate SCENE.json...\n",
28 ✗ static_cast<int>(ernie::app::ViewUsage().size()), ernie::app::ViewUsage().data());
29 ✗ }
30
31 ✗ int PrintDevices() {
32
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ for (const ernie::VulkanDeviceInfo& device : ernie::ListVulkanDevices()) {
33
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ std::printf("%s (%s, Vulkan %u.%u%s)\n", device.name.c_str(), ernie::ToString(device.type),
34
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ device.apiMajor, device.apiMinor,
35
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ device.capabilities.rayQuery ? ", ray queries" : "");
36 ✗ }
37 ✗ return 0;
38 }
39
40 /// Writes the views of the schema registry that `arguments` ask for.
41 ✗ int Schema(const std::vector<std::string_view>& arguments) {
42
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ if (arguments.empty() || arguments.size() % 2 != 0) {
43 ✗ PrintUsage();
44 ✗ return 2;
45 }
46
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ for (std::size_t i = 0; i < arguments.size(); i += 2) {
47 ✗ const fs::path out(arguments[i + 1]);
48
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (arguments[i] == "--json-schema") {
49
0/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ ernie::WriteTextFile(out, ernie::SceneJsonSchema());
50
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ } else if (arguments[i] == "--markdown") {
51
0/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ for (const ernie::SchemaFamily& family : ernie::SchemaFamilies()) {
52
0/8
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ ernie::WriteTextFile(out / (std::string(family.name) + ".md"),
53
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ ernie::ReferencePage(family));
54 }
55
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ } else if (arguments[i] == "--usda") {
56
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ const ernie::UsdSchemaPlugin plugin = ernie::ErnieUsdSchemaPlugin();
57
0/6
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ ernie::WriteTextFile(out / "generatedSchema.usda", plugin.generatedSchema);
58
0/6
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ ernie::WriteTextFile(out / "plugInfo.json", plugin.plugInfo);
59 ✗ } else {
60
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ PrintUsage();
61 ✗ return 2;
62 }
63 ✗ }
64 return 0;
65 }
66
67 /// Prints every problem of the scene files; fails if any has one.
68 ✗ int Validate(const std::vector<std::string_view>& files) {
69
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (files.empty()) {
70 ✗ PrintUsage();
71 ✗ return 2;
72 }
73 ✗ int status = 0;
74
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ for (const std::string_view file : files) {
75 ✗ for (const ernie::SceneProblem& problem :
76
0/6
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ ernie::ValidateScene(ernie::ReadTextFile(fs::path(file)))) {
77
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ std::printf("%.*s: %s\n", static_cast<int>(file.size()), file.data(),
78
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ problem.Message().c_str());
79 ✗ status = 1;
80 ✗ }
81 }
82 ✗ return status;
83 }
84
85 /// Opens the viewer; only `ernie`, `ernie view` and a scene file or viewer options get here.
86 ✗ int View(const std::vector<std::string_view>& arguments) {
87 ✗ ernie::app::ViewCommand command;
88 ✗ try {
89
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ command = ernie::app::ParseViewCommand(arguments);
90
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ } catch (const std::invalid_argument& error) {
91
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ std::fprintf(stderr, "ernie: %s\n", error.what());
92
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ PrintUsage();
93 ✗ return 2;
94 ✗ }
95
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ return ernie::app::RunView(command);
96 ✗ }
97
98 } // namespace
99
100 ✗ int main(int argc, char** argv) {
101
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ const std::vector<std::string_view> arguments(argv + std::min(argc, 1), argv + argc);
102
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ const std::string_view command = arguments.empty() ? "" : arguments.front();
103
0/6
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ const std::vector<std::string_view> rest(arguments.begin() + (arguments.empty() ? 0 : 1),
104
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ arguments.end());
105 ✗ try {
106
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (command == "--version") {
107
0/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ std::printf("ernie %.*s\n", static_cast<int>(ernie::Version().size()),
108
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ ernie::Version().data());
109 ✗ return 0;
110 }
111
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (command == "--help") {
112
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ PrintUsage();
113 return 0;
114 }
115
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (command == "--devices") {
116
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ return PrintDevices();
117 }
118
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (command == "schema") {
119
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ return Schema(rest);
120 }
121
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ if (command == "validate") {
122
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ return Validate(rest);
123 }
124
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ return View(command == "view" ? rest : arguments);
125
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ } catch (const std::exception& error) {
126
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ std::fprintf(stderr, "ernie: %s\n", error.what());
127 ✗ return 1;
128 ✗ }
129 ✗ }
130