text: /*
   * Copyright 2015 WebAssembly Community Group participants
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  //
  // Command line helpers.
  //
  
  #ifndef wasm_support_command_line_h
  #define wasm_support_command_line_h
  
  #include <functional>
  #include <map>
  #include <string>
  #include <utility>
  #include <vector>
  
  #include "wasm.h"
  
  namespace wasm {
  
  class Options {
  public:
    using Action = std::function<void(Options*, const std::string&)>;
  
    enum class Arguments {
      // No arguments.
      Zero,
      // One argument, in the form  --flag A  or  --flag=A
      One,
      // Multiple arguments, in the form --flag A B C
      N,
      // An optional single argument, in the form --flag=A (we disallow --flag A
      // as that would be ambiguous regarding whether A is another flag, or an
      // argument to us).
      Optional
    };
  
    bool debug;
    std::map<std::string, std::string> extra;
  
    Options(const std::string& command, const std::string& description);
    ~Options();
    Options& add(const std::string& longName,
                 const std::string& shortName,
                 const std::string& description,
                 const std::string& category,
                 Arguments arguments,
                 const Action& action,
                 bool hidden = false);
    Options& add_positional(const std::string& name,
                            Arguments arguments,
                            const Action& action);
    void parse(int argc, const char* argv[]);
  
  private:
    struct Option {
      std::string longName;
      std::string shortName;
      std::string description;
      std::string category;
      Arguments arguments;
      Action action;
      bool hidden;
      size_t seen;
    };
    std::vector<Option> options;
    Arguments positional;
    std::string positionalName;
    Action positionalAction;
  
    // The category names, in the order in which help will be printed.
    std::vector<std::string> categories;
  };
  
  } // namespace wasm
  
  #endif // wasm_support_command_line_h
  