// Copyright 2017 The Bazel Authors. All rights reserved.
//
// 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.

syntax = "proto3";

package command_line;

import "src/main/protobuf/option_filters.proto";

// option java_api_version = 2;
option java_package = "com.google.devtools.build.lib.runtime.proto";

// Representation of a Bazel command line.
message CommandLine {
  // A title for this command line value, to differentiate it from others.
  // In particular, a single invocation may wish to report both the literal and
  // canonical command lines, and this label would be used to differentiate
  // between both versions. This is a string for flexibility.
  string command_line_label = 1;

  // A Bazel command line is made of distinct parts. For example,
  //    `bazel --nomaster_bazelrc test --nocache_test_results //foo:aTest`
  // has the executable "bazel", a startup flag, a command "test", a command
  // flag, and a test target. There could be many more flags and targets, or
  // none (`bazel info` for example), but the basic structure is there. The
  // command line should be broken down into these logical sections here.
  repeated CommandLineSection sections = 2;
}

// A section of the Bazel command line.
message CommandLineSection {
  // The name of this section, such as "startup_option" or "command".
  string section_label = 1;

  oneof section_type {
    // Sections with non-options, such as the list of targets or the command,
    // should use simple string chunks.
    ChunkList chunk_list = 2;

    // Startup and command options are lists of options and belong here.
    OptionList option_list = 3;
  }
}

// Wrapper to allow a list of strings in the "oneof" section_type.
message ChunkList {
  repeated string chunk = 1;
}

// Wrapper to allow a list of options in the "oneof" section_type.
message OptionList {
  repeated Option option = 1;
}

// A single command line option.
//
// This represents the option itself, but does not take into account the type of
// option or how the parser interpreted it. If this option is part of a command
// line that represents the actual input that Bazel received, it would, for
// example, include expansion flags as they are. However, if this option
// represents the canonical form of the command line, with the values as Bazel
// understands them, then the expansion flag, which has no value, would not
// appear, and the flags it expands to would.
message Option {
  // How the option looks with the option and its value combined. Depending on
  // the purpose of this command line report, this could be the canonical
  // form, or the way that the flag was set.
  //
  // Some examples: this might be `--foo=bar` form, or `--foo bar` with a space;
  // for boolean flags, `--nobaz` is accepted on top of `--baz=false` and other
  // negating values, or for a positive value, the unqualified `--baz` form
  // is also accepted. This could also be a short `-b`, if the flag has an
  // abbreviated form.
  string combined_form = 1;

  // The canonical name of the option, without the preceding dashes.
  string option_name = 2;

  // The value of the flag, or unset for flags that do not take values.
  // Especially for boolean flags, this should be in canonical form, the
  // combined_form field above gives room for showing the flag as it was set
  // if that is preferred.
  string option_value = 3;

  // This flag's tagged effects. See OptionEffectTag's java documentation for
  // details.
  repeated options.OptionEffectTag effect_tags = 4;

  // Metadata about the flag. See OptionMetadataTag's java documentation for
  // details.
  repeated options.OptionMetadataTag metadata_tags = 5;

  // The source of the flag (i.e. whether is was explicitly passed by the user,
  // from which .{bazel,blaze}rc it comes, etc).
  string source = 6;
}
