/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.
 */

package com.facebook.buck.util;

/**
 * An indication of how verbose Buck should be. Enum values are in order from least to most verbose.
 */
public enum Verbosity {
  // TODO(mbolin): Consider introducing more Verbosity levels that affect the Java Logger setting.

  /** Do not print anything to the console. */
  SILENT,

  /**
   * Prints out the bare minimum required information, such as errors from build steps.
   */
  STANDARD_INFORMATION,

  /** Print the command being executed, but do not print its output. */
  COMMANDS,

  /** Print the command being executed followed by its output. */
  COMMANDS_AND_OUTPUT,

  /**
   * If the command being executed has its own {@code --verbose} option or equivalent, it should be
   * used.
   */
  ALL,
  ;

  public boolean shouldPrintStandardInformation() {
    return this.ordinal() >= STANDARD_INFORMATION.ordinal();
  }

  public boolean shouldPrintCommand() {
    return this.ordinal() >= COMMANDS.ordinal();
  }

  public boolean shouldPrintOutput() {
    return this.ordinal() >= COMMANDS_AND_OUTPUT.ordinal();
  }

  /**
   * @return {@code true} if the command being executed should use its own {@code --verbose}
   *     argument (or equivalent) for this Verbosity level
   */
  public boolean shouldUseVerbosityFlagIfAvailable() {
    return this == ALL;
  }
}
