The Battle for Wesnoth  1.19.6+dev
commandline_options.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2024
3  by Lukasz Dobrogowski <lukasz.dobrogowski@gmail.com>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include "log.hpp" // for logger, set_strict_severity, etc
19 
20 #include "utils/optional_fwd.hpp"
21 
22 #include <boost/program_options/options_description.hpp>
23 #include <iosfwd> // for ostream
24 #include <string> // for string
25 #include <tuple>
26 #include <vector> // for vector
27 
28 class bad_commandline_resolution : public boost::program_options::error
29 {
30 public:
31  bad_commandline_resolution(const std::string& resolution);
32 };
33 
34 class bad_commandline_tuple : public boost::program_options::error
35 {
36 public:
37  bad_commandline_tuple(const std::string& str,
38  const std::string& expected_format);
39 };
40 
41 class config;
42 
44 {
45  /** To be used for printing help to the commandline. */
46  friend std::ostream& operator<<(std::ostream &os, const commandline_options& cmdline_opts);
47 
48 public:
49  commandline_options(const std::vector<std::string>& args);
50 
51  config to_config() const; /* Used by lua scrips. Not all of the options need to be exposed here, just those exposed to lua */
52 
53  /** True if the --validate or any of the --validate-* options are given. */
54  bool any_validation_option() const;
55 
56  /** Non-empty if --campaign was given on the command line. ID of the campaign we want to start. */
57  utils::optional<std::string> campaign;
58  /** Non-empty if --campaign-difficulty was given on the command line. Numerical difficulty of the campaign to be played. Dependent on --campaign. */
59  utils::optional<int> campaign_difficulty;
60  /** Non-empty if --campaign-scenario was given on the command line. Chooses starting scenario in the campaign to be played. Dependent on --campaign. */
61  utils::optional<std::string> campaign_scenario;
62  /** True if --skip-story was given on the command line. Skips [story] and [message]s through the end of the "start" event. Dependent on --campaign. */
64  /** True if --clock was given on the command line. Enables */
65  bool clock;
66  /** Non-empty if --core was given on the command line. Chooses the core to be loaded. */
67  utils::optional<std::string> core_id;
68  /** True if --data-path was given on the command line. Prints path to data directory and exits. */
69  bool data_path;
70  /** Non-empty if --data-dir was given on the command line. Sets the config dir to the specified one. */
71  utils::optional<std::string> data_dir;
72  /** True if --debug was given on the command line. Enables debug mode. */
73  bool debug;
74  /** True if --debug-lua was given in the commandline. Enables some Lua debugging mechanisms. */
75  bool debug_lua;
76  /** True if --strict-lua was given in the commandline. Disallows use of deprecated APIs. */
77  bool strict_lua;
78  /**
79  * True if --allow-insecure was given in the commandline.
80  * Allows sending a plaintext password over an unencrypted connection.
81  * Should only ever be used for local testing.
82  */
84 #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS
85  /** Non-empty if --debug-dot-domain was given on the command line. */
86  utils::optional<std::string> debug_dot_domain;
87  /** Non-empty if --debug-dot-level was given on the command line. */
88  utils::optional<std::string> debug_dot_level;
89 #endif
90  /** Non-empty if --editor was given on the command line. Goes directly into editor. If string is longer than 0, it contains path to the file to edit. */
91  utils::optional<std::string> editor;
92  /** True if --fps was given on the command line. Shows number of fps. */
93  bool fps;
94  /** True if --fullscreen was given on the command line. Starts Wesnoth in fullscreen mode. */
95  bool fullscreen;
96  /** True if --help was given on the command line. Prints help and exits. */
97  bool help;
98  /** Non-empty if --language was given on the command line. Sets the language for this session. */
99  utils::optional<std::string> language;
100  /**
101  * Contains parsed arguments of --log-* (e.g. --log-debug).
102  * Vector of pairs (severity, log domain).
103  */
104  utils::optional<std::vector<std::pair<lg::severity, std::string>>> log;
105  /** Non-empty if --log-strict was given */
106  utils::optional<int> log_strict_level;
107  /** Non-empty if --load was given on the command line. Savegame specified to load after start. */
108  utils::optional<std::string> load;
109  /** Non-empty if --logdomains was given on the command line. Prints possible logdomains filtered by given string and exits. */
110  utils::optional<std::string> logdomains;
111  /** True if --log-precise was given on the command line. Shows timestamps in log with more precision. */
113  /** True if --multiplayer was given on the command line. Goes directly into multiplayer mode. */
115  /** Non-empty if --ai-config was given on the command line. Vector of pairs (side number, value). Dependent on --multiplayer. */
116  utils::optional<std::vector<std::pair<unsigned int, std::string>>> multiplayer_ai_config;
117  /** Non-empty if --algorithm was given on the command line. Vector of pairs (side number, value). Dependent on --multiplayer. */
118  utils::optional<std::vector<std::pair<unsigned int, std::string>>> multiplayer_algorithm;
119  /** Non-empty if --controller was given on the command line. Vector of pairs (side number, controller). Dependent on --multiplayer. */
120  utils::optional<std::vector<std::pair<unsigned int, std::string>>> multiplayer_controller;
121  /** Non-empty if --era was given on the command line. Dependent on --multiplayer. */
122  utils::optional<std::string> multiplayer_era;
123  /** True if --exit-at-and was given on the command line. Dependent on --multiplayer. */
125  /** True if --ignore-map-settings was given at the command line. Do not use map settings. */
127  /** Non-empty if --label was given on the command line. Dependent on --multiplayer. */
128  utils::optional<std::string> multiplayer_label;
129  /** Non-empty if --parm was given on the command line. Vector of pairs (side number, parm name, parm value). Dependent on --multiplayer. */
130  utils::optional<std::vector<std::tuple<unsigned int, std::string, std::string>>> multiplayer_parm;
131  /** Repeats specified by --multiplayer-repeat option. Repeats a multiplayer game after it is finished. Dependent on --multiplayer. */
132  utils::optional<unsigned int> multiplayer_repeat;
133  /** Non-empty if --scenario was given on the command line. Dependent on --multiplayer. */
134  utils::optional<std::string> multiplayer_scenario;
135  /** Non-empty if --side was given on the command line. Vector of pairs (side number, faction id). Dependent on --multiplayer. */
136  utils::optional<std::vector<std::pair<unsigned int, std::string>>> multiplayer_side;
137  /** Non-empty if --turns was given on the command line. Dependent on --multiplayer. */
138  utils::optional<std::string> multiplayer_turns;
139  /** Max FPS specified by --max-fps option. */
140  utils::optional<int> max_fps;
141  /** True if --noaddons was given on the command line. Disables the loading of all add-ons. */
142  bool noaddons;
143  /** True if --nocache was given on the command line. Disables cache usage. */
144  bool nocache;
145  /** True if --nogui was given on the command line. Disables GUI. */
146  bool nogui;
147  /** True if --nobanner was given on the command line. Disables startup banner. */
148  bool nobanner;
149  /** True if --nomusic was given on the command line. Disables music. */
150  bool nomusic;
151  /** True if --nosound was given on the command line. Disables sound. */
152  bool nosound;
153  /** True if --new-widgets was given on the command line. Hidden option to enable the new widget toolkit. */
155  /** True if --preprocess was given on the command line. Starts Wesnoth in preprocessor-only mode. */
157  /** Defines that were given to the --preprocess option. */
158  utils::optional<std::vector<std::string>> preprocess_defines;
159  /** Non-empty if --preprocess-input-macros was given on the command line. Specifies a file that contains [preproc_define]s to be included before preprocessing. Dependent on --preprocess. */
160  utils::optional<std::string> preprocess_input_macros;
161  /** Non-empty if --preprocess-output-macros was given on the command line. Outputs all preprocessed macros to the specified file. Dependent on --preprocess. */
162  utils::optional<std::string> preprocess_output_macros;
163  /** Path to parse that was given to the --preprocess option. */
164  utils::optional<std::string> preprocess_path;
165  /** Target (output) path that was given to the --preprocess option. */
166  utils::optional<std::string> preprocess_target;
167  /** String to preprocess */
168  utils::optional<std::string> preprocess_source_string;
169  /** Pair of AxB values specified after --resolution. Changes Wesnoth resolution. */
170  utils::optional<std::pair<int,int>> resolution;
171  /** RNG seed specified by --rng-seed option. Initializes RNG with given seed. */
172  utils::optional<unsigned int> rng_seed;
173  /** Non-empty if --server was given on the command line. Connects Wesnoth to specified server. If no server was specified afterwards, contains an empty string. */
174  utils::optional<std::string> server;
175  /** Non-empty if --username was given on the command line. Forces Wesnoth to use this network username. */
176  utils::optional<std::string> username;
177  /** Non-empty if --password was given on the command line. Forces Wesnoth to use this network password. */
178  utils::optional<std::string> password;
179  /** Image path to render. First parameter after --render-image */
180  utils::optional<std::string> render_image;
181  /** Output file to put rendered image path in. Optional second parameter after --render-image */
182  utils::optional<std::string> render_image_dst;
183  /** Path of which to generate a spritesheet */
184  utils::optional<std::string> generate_spritesheet;
185  /** True if --screenshot was given on the command line. Starts Wesnoth in screenshot mode. */
187  /** Map file to make a screenshot of. First parameter given after --screenshot. */
188  utils::optional<std::string> screenshot_map_file;
189  /** Output file to put screenshot in. Second parameter given after --screenshot. */
190  utils::optional<std::string> screenshot_output_file;
191  /** File to load lua script from. */
192  utils::optional<std::string> script_file;
193  /** File to load a lua plugin (similar to a script) from. Experimental / may replace script. */
194  utils::optional<std::string> plugin_file;
195  /** Whether to load the "package" package for the scripting environment. (This allows to load arbitrary lua packages, and gives untrusted lua the same permissions as wesnoth executable) */
197  /** True if --strict-validation was given on the command line. Makes Wesnoth trust validation errors as fatal WML errors and create WML exception, if so. */
199  /** Non-empty if --test was given on the command line. Goes directly into test mode, into a scenario, if specified. */
200  utils::optional<std::string> test;
201  /** Non-empty if --unit was given on the command line. Goes directly into unit test mode, into a scenario, if specified. */
202  std::vector<std::string> unit_test;
203  /** True if --unit is used and --showgui is not present. */
205  /** True if --noreplaycheck was given on the command line. Dependent on --unit. */
207  /** True if --mp-test was given on the command line. */
208  bool mptest;
209  /** True if --usercache-path was given on the command line. Prints path to cache directory and exits. */
211  /** Non-empty if --usercache-dir was given on the command line. Sets the cache dir to the specified one. */
212  utils::optional<std::string> usercache_dir;
213  /** True if --userdata-path was given on the command line. Prints path to user data directory and exits. */
215  /** Non-empty if --userdata-dir was given on the command line. Sets the user data dir to the specified one. */
216  utils::optional<std::string> userdata_dir;
217  /** True if --validcache was given on the command line. Makes Wesnoth assume the cache is valid. */
219  /** True if --validate-core was given on the command line. Makes Wesnoth validate the core WML. */
221  /** Non-empty if --validate-addon was given on the command line. Makes Wesnoth validate an addon's WML. */
222  utils::optional<std::string> validate_addon;
223  /** Non-empty if --validate-schema was given on the command line. Makes Wesnoth validate a WML schema. */
224  utils::optional<std::string> validate_schema;
225  /** Non-empty if --validate was given on the command line. Makes Wesnoth validate a WML file against a schema. */
226  utils::optional<std::string> validate_wml;
227  /** Non-empty if --use-schema was given on the command line. Specifies the schema for use with --validate. */
228  utils::optional<std::string> validate_with;
229  /** Output filename for WML diff or preprocessing */
230  utils::optional<std::string> output_file;
232  /** Files for diffing or patching */
233  std::string diff_left, diff_right;
234  /** True if --version was given on the command line. Prints version and exits. */
235  bool version;
236  /** True if --simple-version was given on the command line. Prints version and nothing else then exits. */
238  /** True if --report was given on the command line. Prints a bug report-style info dump and exits. */
239  bool report;
240  /** True if --windowed was given on the command line. Starts Wesnoth in windowed mode. */
241  bool windowed;
242  /** True if --with-replay was given on the command line. Shows replay of the loaded file. */
244 #ifdef _WIN32
245  /** True if --wnoconsole was given on the command line. Prevents logs from being written to the console window if Wesnoth is launched from the command prompt on Windows. */
246  bool no_console;
247 #endif
248  /** True if --no-log-sanitize was given on the command line. Prevents removal of OS user from file paths in log files. */
250  /**
251  * True if --log-to-file was given on the command line.
252  * Forces output to be written to a log file. Takes priority over any arguments that implicitly prevent logging to file.
253  */
255  /** True if --no-log-to-file was given on the command line. Results in logs not being redirected to a log file. */
257  /** Non-empty if --all-translations or --translations-over is given on the command line. */
258  utils::optional<unsigned int> translation_percent;
259 private:
260  void parse_log_domains_(const std::string &domains_string, const lg::severity severity);
261  void parse_log_strictness (const std::string &severity);
262  void parse_resolution_ (const std::string &resolution_string);
263  /** A helper function splitting vector of strings of format unsigned int:string to vector of tuples (unsigned int,string) */
264  std::vector<std::pair<unsigned int,std::string>> parse_to_uint_string_tuples_(const std::vector<std::string> &strings, char separator = ':');
265  /** A helper function splitting vector of strings of format unsigned int:string:string to vector of tuples (unsigned int,string,string) */
266  std::vector<std::tuple<unsigned int,std::string,std::string>> parse_to_uint_string_string_tuples_(const std::vector<std::string> &strings, char separator = ':');
267  std::vector<std::string> args_;
268  std::string args0_;
269  boost::program_options::options_description all_;
270  boost::program_options::options_description visible_;
271  boost::program_options::options_description hidden_;
272 };
bad_commandline_resolution(const std::string &resolution)
bad_commandline_tuple(const std::string &str, const std::string &expected_format)
bool nogui
True if –nogui was given on the command line.
utils::optional< std::vector< std::pair< unsigned int, std::string > > > multiplayer_side
Non-empty if –side was given on the command line.
utils::optional< std::pair< int, int > > resolution
Pair of AxB values specified after –resolution.
utils::optional< std::string > validate_wml
Non-empty if –validate was given on the command line.
bool simple_version
True if –simple-version was given on the command line.
bool report
True if –report was given on the command line.
boost::program_options::options_description hidden_
bool headless_unit_test
True if –unit is used and –showgui is not present.
utils::optional< std::string > screenshot_map_file
Map file to make a screenshot of.
utils::optional< std::string > multiplayer_scenario
Non-empty if –scenario was given on the command line.
utils::optional< std::string > test
Non-empty if –test was given on the command line.
bool no_log_sanitize
True if –no-log-sanitize was given on the command line.
bool windowed
True if –windowed was given on the command line.
bool strict_lua
True if –strict-lua was given in the commandline.
utils::optional< std::string > language
Non-empty if –language was given on the command line.
std::vector< std::pair< unsigned int, std::string > > parse_to_uint_string_tuples_(const std::vector< std::string > &strings, char separator=':')
A helper function splitting vector of strings of format unsigned int:string to vector of tuples (unsi...
utils::optional< std::vector< std::string > > preprocess_defines
Defines that were given to the –preprocess option.
bool noreplaycheck
True if –noreplaycheck was given on the command line.
utils::optional< std::string > screenshot_output_file
Output file to put screenshot in.
void parse_log_domains_(const std::string &domains_string, const lg::severity severity)
utils::optional< std::string > usercache_dir
Non-empty if –usercache-dir was given on the command line.
utils::optional< int > max_fps
Max FPS specified by –max-fps option.
utils::optional< std::string > core_id
Non-empty if –core was given on the command line.
bool multiplayer_exit_at_end
True if –exit-at-and was given on the command line.
utils::optional< std::string > validate_addon
Non-empty if –validate-addon was given on the command line.
utils::optional< int > campaign_difficulty
Non-empty if –campaign-difficulty was given on the command line.
utils::optional< unsigned int > multiplayer_repeat
Repeats specified by –multiplayer-repeat option.
utils::optional< std::string > validate_schema
Non-empty if –validate-schema was given on the command line.
bool debug
True if –debug was given on the command line.
bool mptest
True if –mp-test was given on the command line.
void parse_log_strictness(const std::string &severity)
bool nosound
True if –nosound was given on the command line.
bool multiplayer
True if –multiplayer was given on the command line.
utils::optional< std::string > server
Non-empty if –server was given on the command line.
bool script_unsafe_mode
Whether to load the "package" package for the scripting environment.
utils::optional< std::string > userdata_dir
Non-empty if –userdata-dir was given on the command line.
std::vector< std::string > args_
utils::optional< unsigned int > translation_percent
Non-empty if –all-translations or –translations-over is given on the command line.
utils::optional< std::string > plugin_file
File to load a lua plugin (similar to a script) from.
bool nobanner
True if –nobanner was given on the command line.
utils::optional< std::vector< std::pair< lg::severity, std::string > > > log
Contains parsed arguments of –log-* (e.g.
bool validcache
True if –validcache was given on the command line.
utils::optional< std::string > generate_spritesheet
Path of which to generate a spritesheet.
std::vector< std::tuple< unsigned int, std::string, std::string > > parse_to_uint_string_string_tuples_(const std::vector< std::string > &strings, char separator=':')
A helper function splitting vector of strings of format unsigned int:string:string to vector of tuple...
bool nomusic
True if –nomusic was given on the command line.
bool clock
True if –clock was given on the command line.
utils::optional< std::string > render_image_dst
Output file to put rendered image path in.
utils::optional< std::string > render_image
Image path to render.
utils::optional< std::string > script_file
File to load lua script from.
boost::program_options::options_description visible_
utils::optional< std::string > campaign
Non-empty if –campaign was given on the command line.
utils::optional< std::string > logdomains
Non-empty if –logdomains was given on the command line.
bool new_widgets
True if –new-widgets was given on the command line.
utils::optional< std::string > preprocess_input_macros
Non-empty if –preprocess-input-macros was given on the command line.
bool preprocess
True if –preprocess was given on the command line.
utils::optional< unsigned int > rng_seed
RNG seed specified by –rng-seed option.
std::string diff_left
Files for diffing or patching.
utils::optional< std::vector< std::pair< unsigned int, std::string > > > multiplayer_ai_config
Non-empty if –ai-config was given on the command line.
bool data_path
True if –data-path was given on the command line.
bool version
True if –version was given on the command line.
utils::optional< std::string > multiplayer_label
Non-empty if –label was given on the command line.
bool allow_insecure
True if –allow-insecure was given in the commandline.
void parse_resolution_(const std::string &resolution_string)
utils::optional< std::string > multiplayer_era
Non-empty if –era was given on the command line.
utils::optional< std::string > validate_with
Non-empty if –use-schema was given on the command line.
bool noaddons
True if –noaddons was given on the command line.
bool fps
True if –fps was given on the command line.
utils::optional< std::string > output_file
Output filename for WML diff or preprocessing.
utils::optional< int > log_strict_level
Non-empty if –log-strict was given.
utils::optional< std::string > multiplayer_turns
Non-empty if –turns was given on the command line.
commandline_options(const std::vector< std::string > &args)
utils::optional< std::string > data_dir
Non-empty if –data-dir was given on the command line.
utils::optional< std::string > username
Non-empty if –username was given on the command line.
utils::optional< std::string > preprocess_target
Target (output) path that was given to the –preprocess option.
bool campaign_skip_story
True if –skip-story was given on the command line.
bool with_replay
True if –with-replay was given on the command line.
bool screenshot
True if –screenshot was given on the command line.
bool log_to_file
True if –log-to-file was given on the command line.
bool debug_lua
True if –debug-lua was given in the commandline.
std::vector< std::string > unit_test
Non-empty if –unit was given on the command line.
bool userdata_path
True if –userdata-path was given on the command line.
bool log_precise_timestamps
True if –log-precise was given on the command line.
utils::optional< std::string > preprocess_source_string
String to preprocess.
bool no_log_to_file
True if –no-log-to-file was given on the command line.
bool multiplayer_ignore_map_settings
True if –ignore-map-settings was given at the command line.
utils::optional< std::string > editor
Non-empty if –editor was given on the command line.
utils::optional< std::string > password
Non-empty if –password was given on the command line.
utils::optional< std::string > preprocess_output_macros
Non-empty if –preprocess-output-macros was given on the command line.
bool fullscreen
True if –fullscreen was given on the command line.
friend std::ostream & operator<<(std::ostream &os, const commandline_options &cmdline_opts)
To be used for printing help to the commandline.
bool any_validation_option() const
True if the –validate or any of the –validate-* options are given.
utils::optional< std::vector< std::pair< unsigned int, std::string > > > multiplayer_controller
Non-empty if –controller was given on the command line.
bool strict_validation
True if –strict-validation was given on the command line.
bool validate_core
True if –validate-core was given on the command line.
utils::optional< std::vector< std::pair< unsigned int, std::string > > > multiplayer_algorithm
Non-empty if –algorithm was given on the command line.
utils::optional< std::string > preprocess_path
Path to parse that was given to the –preprocess option.
bool help
True if –help was given on the command line.
bool usercache_path
True if –usercache-path was given on the command line.
bool nocache
True if –nocache was given on the command line.
utils::optional< std::vector< std::tuple< unsigned int, std::string, std::string > > > multiplayer_parm
Non-empty if –parm was given on the command line.
boost::program_options::options_description all_
utils::optional< std::string > campaign_scenario
Non-empty if –campaign-scenario was given on the command line.
utils::optional< std::string > load
Non-empty if –load was given on the command line.
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:172
Standard logging facilities (interface).
severity
Definition: log.hpp:83