Zappy GUI
C++ graphic client: renderer, camera, network
Loading...
Searching...
No Matches
Args.cpp
Go to the documentation of this file.
1#include "Args.hpp"
2
3#include <iostream>
4
5Args::Args(int argc, char** argv) { parseArgs(argc, argv); }
6
7bool Args::isValid() const { return result == ParseResult::Success; }
8
9bool Args::isHelpRequested() const { return result == ParseResult::HelpRequested; }
10
11int Args::exitCode() const
12{
13 if (result == ParseResult::Success || result == ParseResult::HelpRequested) {
14 return SUCCESS;
15 }
16 return ERROR;
17}
18
19AppConfig Args::getConfig() const { return config; }
20
21void Args::parseArgs(int argc, char** argv)
22{
23 if (argc < 2) {
24 setError("No arguments provided", argv[0]);
25 return;
26 }
27
28 for (int i = 1; i < argc; ++i) {
29 std::string arg = argv[i];
30
31 if (arg == "--help") {
32 printUsage(argv[0]);
33 result = ParseResult::HelpRequested;
34 return;
35 } else if (arg == "--headless") {
36 config.headless = true;
37 } else if (arg == "--dev") {
38 if (i + 1 >= argc) {
39 setError("--dev requires a value (true or false)", argv[0]);
40 return;
41 }
42 std::string val = argv[++i];
43 if (val == "true")
44 config.dev = true;
45 else if (val == "false")
46 config.dev = false;
47 else {
48 setError("--dev value must be true or false", argv[0]);
49 return;
50 }
51 } else if (arg == "--language") {
52 if (i + 1 >= argc) {
53 setError("--language requires a value (english or french)", argv[0]);
54 return;
55 }
56 std::string lang = argv[++i];
57 if (lang == "french")
58 config.language = I18n::Language::FR;
59 else if (lang == "english")
60 config.language = I18n::Language::EN;
61 else {
62 setError("Unknown language: " + lang + " (use english or french)", argv[0]);
63 return;
64 }
65 } else if (arg == "-p") {
66 if (i + 1 >= argc) {
67 setError("-p requires a port number", argv[0]);
68 return;
69 }
70 try {
71 config.port = std::stoi(argv[i + 1]);
72 if (config.port <= 0 || config.port > 65535) {
73 setError("Port must be between 1 and 65535", argv[0]);
74 return;
75 }
76 ++i;
77 } catch (const std::exception&) {
78 setError("Invalid port number: " + std::string(argv[i + 1]), argv[0]);
79 return;
80 }
81 } else if (arg == "-h") {
82 if (i + 1 >= argc) {
83 setError("-h requires a machine name", argv[0]);
84 return;
85 }
86 config.machine = argv[i + 1];
87 ++i;
88 } else {
89 setError("Unknown argument: " + arg, argv[0]);
90 return;
91 }
92 }
93
94 if (config.port == -1) {
95 setError("-p port is required", argv[0]);
96 return;
97 }
98
99 result = ParseResult::Success;
100}
101
102void Args::setError(const std::string& message, const std::string& progName)
103{
104 std::cerr << "Error: " << message << "\n";
105 printUsage(progName);
106 result = ParseResult::Error;
107}
108
109void Args::printUsage(const std::string& progName)
110{
111 std::cerr
112 << "Usage: " << progName
113 << " -p port [-h machine] [--headless] [--dev true|false] [--language english|french]\n";
114 std::cerr << " -p port Port number to connect to (required)\n";
115 std::cerr << " -h machine Machine name or IP address (default: localhost)\n";
116 std::cerr << " --headless Run without graphics (text output only)\n";
117 std::cerr << " --dev true|false Show dev HUD (FPS, time unit, connection info)\n";
118 std::cerr << " --language english|french UI language (default: english)\n";
119 std::cerr << " --help Show this help message\n";
120}
int exitCode() const
Definition Args.cpp:11
static constexpr int SUCCESS
ServerConfig config
Args(int argc, char **argv)
Definition Args.cpp:5
ParseResult result
Definition Args.hpp:59
ServerConfig getConfig() const
Definition Args.cpp:19
static constexpr int ERROR
bool isHelpRequested() const
Definition Args.cpp:9
bool isValid() const
Definition Args.cpp:7
Represents the configuration for the application, including the port, machine, and headless mode.
Definition Args.hpp:11