// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #pragma once #include "ActionAndArgs.h" #include "Commandline.h" #ifdef UNIT_TESTING // fwdecl unittest classes namespace TerminalAppLocalTests { class CommandlineTest; }; #endif namespace TerminalApp { class AppCommandlineArgs; }; class TerminalApp::AppCommandlineArgs final { public: static constexpr std::string_view NixHelpFlag{ "-?" }; static constexpr std::string_view WindowsHelpFlag{ "/?" }; static constexpr std::wstring_view PlaceholderExeName{ L"wt.exe" }; AppCommandlineArgs(); ~AppCommandlineArgs() = default; int ParseCommand(const Commandline& command); static std::vector BuildCommands(const std::vector& args); static std::vector BuildCommands(winrt::array_view& args); void ValidateStartupCommands(); std::deque& GetStartupActions(); const std::string& GetExitMessage(); private: static const std::wregex _commandDelimiterRegex; CLI::App _app{ "wt - the Windows Terminal" }; // This is a helper struct to encapsulate all the options for a subcommand // that produces a NewTerminalArgs. struct NewTerminalSubcommand { CLI::App* subcommand; CLI::Option* commandlineOption; CLI::Option* profileNameOption; CLI::Option* startingDirectoryOption; }; // --- Subcommands --- NewTerminalSubcommand _newTabCommand; NewTerminalSubcommand _newPaneCommand; CLI::App* _focusTabCommand; // Are you adding a new sub-command? Make sure to update _noCommandsProvided! CLI::Option* _horizontalOption; CLI::Option* _verticalOption; std::string _profileName; std::string _startingDirectory; // _commandline will contain the command line with which we'll be spawning a new terminal std::vector _commandline; const Commandline* _currentCommandline{ nullptr }; bool _splitVertical{ false }; bool _splitHorizontal{ false }; int _focusTabIndex{ -1 }; bool _focusNextTab{ false }; bool _focusPrevTab{ false }; // Are you adding more args here? Make sure to reset them in _resetStateToDefault std::deque _startupActions; std::string _exitMessage; winrt::TerminalApp::NewTerminalArgs _getNewTerminalArgs(NewTerminalSubcommand& subcommand); void _addNewTerminalArgs(NewTerminalSubcommand& subcommand); void _buildParser(); void _buildNewTabParser(); void _buildSplitPaneParser(); void _buildFocusTabParser(); bool _noCommandsProvided(); void _resetStateToDefault(); int _handleExit(const CLI::App& command, const CLI::Error& e); static void _addCommandsForArg(std::vector& commands, std::wstring_view arg); #ifdef UNIT_TESTING friend class TerminalAppLocalTests::CommandlineTest; #endif };