// -*- C++ -*-
//
// This file was generated by CLI, a command line interface
// compiler for C++.
//

#ifndef LIBBUILD2_B_OPTIONS_HXX
#define LIBBUILD2_B_OPTIONS_HXX

// Begin prologue.
//
#include <libbuild2/export.hxx>
//
// End prologue.

#include <libbuild2/common-options.hxx>

namespace build2
{
  class LIBBUILD2_SYMEXPORT b_options
  {
    public:
    b_options ();

    // Return true if anything has been parsed.
    //
    bool
    parse (int& argc,
           char** argv,
           bool erase = false,
           ::build2::build::cli::unknown_mode option = ::build2::build::cli::unknown_mode::fail,
           ::build2::build::cli::unknown_mode argument = ::build2::build::cli::unknown_mode::stop);

    bool
    parse (int start,
           int& argc,
           char** argv,
           bool erase = false,
           ::build2::build::cli::unknown_mode option = ::build2::build::cli::unknown_mode::fail,
           ::build2::build::cli::unknown_mode argument = ::build2::build::cli::unknown_mode::stop);

    bool
    parse (int& argc,
           char** argv,
           int& end,
           bool erase = false,
           ::build2::build::cli::unknown_mode option = ::build2::build::cli::unknown_mode::fail,
           ::build2::build::cli::unknown_mode argument = ::build2::build::cli::unknown_mode::stop);

    bool
    parse (int start,
           int& argc,
           char** argv,
           int& end,
           bool erase = false,
           ::build2::build::cli::unknown_mode option = ::build2::build::cli::unknown_mode::fail,
           ::build2::build::cli::unknown_mode argument = ::build2::build::cli::unknown_mode::stop);

    bool
    parse (::build2::build::cli::scanner&,
           ::build2::build::cli::unknown_mode option = ::build2::build::cli::unknown_mode::fail,
           ::build2::build::cli::unknown_mode argument = ::build2::build::cli::unknown_mode::stop);

    // Merge options from the specified instance appending/overriding
    // them as if they appeared after options in this instance.
    //
    void
    merge (const b_options&);

    // Option accessors.
    //
    const uint64_t&
    build2_metadata () const;

    bool
    build2_metadata_specified () const;

    const bool&
    v () const;

    const bool&
    V () const;

    const bool&
    quiet () const;

    const bool&
    silent () const;

    const uint16_t&
    verbose () const;

    bool
    verbose_specified () const;

    const bool&
    stat () const;

    const bool&
    progress () const;

    const bool&
    no_progress () const;

    const bool&
    diag_color () const;

    const bool&
    no_diag_color () const;

    const size_t&
    jobs () const;

    bool
    jobs_specified () const;

    const size_t&
    max_jobs () const;

    bool
    max_jobs_specified () const;

    const size_t&
    queue_depth () const;

    bool
    queue_depth_specified () const;

    const string&
    file_cache () const;

    bool
    file_cache_specified () const;

    const size_t&
    max_stack () const;

    bool
    max_stack_specified () const;

    const bool&
    serial_stop () const;

    const bool&
    dry_run () const;

    const bool&
    no_diag_buffer () const;

    const bool&
    match_only () const;

    const bool&
    load_only () const;

    const bool&
    no_external_modules () const;

    const structured_result_format&
    structured_result () const;

    bool
    structured_result_specified () const;

    const bool&
    mtime_check () const;

    const bool&
    no_mtime_check () const;

    const strings&
    dump () const;

    bool
    dump_specified () const;

    const string&
    dump_format () const;

    bool
    dump_format_specified () const;

    const dir_paths&
    dump_scope () const;

    bool
    dump_scope_specified () const;

    const vector<pair<name, optional<name>>>&
    dump_target () const;

    bool
    dump_target_specified () const;

    const vector<name>&
    trace_match () const;

    bool
    trace_match_specified () const;

    const vector<name>&
    trace_execute () const;

    bool
    trace_execute_specified () const;

    const bool&
    no_column () const;

    const bool&
    no_line () const;

    const path&
    buildfile () const;

    bool
    buildfile_specified () const;

    const path&
    config_guess () const;

    bool
    config_guess_specified () const;

    const path&
    config_sub () const;

    bool
    config_sub_specified () const;

    const string&
    pager () const;

    bool
    pager_specified () const;

    const strings&
    pager_option () const;

    bool
    pager_option_specified () const;

    const string&
    options_file () const;

    bool
    options_file_specified () const;

    const dir_path&
    default_options () const;

    bool
    default_options_specified () const;

    const bool&
    no_default_options () const;

    const bool&
    help () const;

    const bool&
    version () const;

    // Print usage information.
    //
    static ::build2::build::cli::usage_para
    print_usage (::std::ostream&,
                 ::build2::build::cli::usage_para = ::build2::build::cli::usage_para::none);

    // Implementation details.
    //
    protected:
    bool
    _parse (const char*, ::build2::build::cli::scanner&);

    private:
    bool
    _parse (::build2::build::cli::scanner&,
            ::build2::build::cli::unknown_mode option,
            ::build2::build::cli::unknown_mode argument);

    public:
    uint64_t build2_metadata_;
    bool build2_metadata_specified_;
    bool v_;
    bool V_;
    bool quiet_;
    bool silent_;
    uint16_t verbose_;
    bool verbose_specified_;
    bool stat_;
    bool progress_;
    bool no_progress_;
    bool diag_color_;
    bool no_diag_color_;
    size_t jobs_;
    bool jobs_specified_;
    size_t max_jobs_;
    bool max_jobs_specified_;
    size_t queue_depth_;
    bool queue_depth_specified_;
    string file_cache_;
    bool file_cache_specified_;
    size_t max_stack_;
    bool max_stack_specified_;
    bool serial_stop_;
    bool dry_run_;
    bool no_diag_buffer_;
    bool match_only_;
    bool load_only_;
    bool no_external_modules_;
    structured_result_format structured_result_;
    bool structured_result_specified_;
    bool mtime_check_;
    bool no_mtime_check_;
    strings dump_;
    bool dump_specified_;
    string dump_format_;
    bool dump_format_specified_;
    dir_paths dump_scope_;
    bool dump_scope_specified_;
    vector<pair<name, optional<name>>> dump_target_;
    bool dump_target_specified_;
    vector<name> trace_match_;
    bool trace_match_specified_;
    vector<name> trace_execute_;
    bool trace_execute_specified_;
    bool no_column_;
    bool no_line_;
    path buildfile_;
    bool buildfile_specified_;
    path config_guess_;
    bool config_guess_specified_;
    path config_sub_;
    bool config_sub_specified_;
    string pager_;
    bool pager_specified_;
    strings pager_option_;
    bool pager_option_specified_;
    string options_file_;
    bool options_file_specified_;
    dir_path default_options_;
    bool default_options_specified_;
    bool no_default_options_;
    bool help_;
    bool version_;
  };
}

// Print page usage information.
//
namespace build2
{
  LIBBUILD2_SYMEXPORT ::build2::build::cli::usage_para
  print_b_usage (::std::ostream&,
                 ::build2::build::cli::usage_para = ::build2::build::cli::usage_para::none);
}

#include <libbuild2/b-options.ixx>

// Begin epilogue.
//
//
// End epilogue.

#endif // LIBBUILD2_B_OPTIONS_HXX
