/*
 * Copyright 2013-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.rules;

import com.facebook.buck.step.Step;

import java.io.IOException;
import java.util.List;

import javax.annotation.Nullable;

/**
 * Represents something that Buck is able to build, encapsulating the logic of how to determine
 * whether the rule needs to be rebuilt and how to actually go about building the rule itself.
 */
public interface Buildable {

  public BuildableProperties getProperties();

  /**
   * Get the set of input files whose contents should be hashed for the purpose of determining
   * whether this rule is cached.
   * <p>
   * Note that inputs are iterable and should generally be alphatized so that lists with the same
   * elements will be {@code .equals()} to one another. However, for some build rules (such as
   * {@link com.facebook.buck.shell.Genrule}), the order of the inputs is significant and in these
   * cases the inputs may be ordered in any way the rule feels most appropriate.
   */
  public Iterable<String> getInputsToCompareToOutput();

  /**
   * When this method is invoked, all of its dependencies will have been built.
   */
  public List<Step> getBuildSteps(BuildContext context, BuildableContext buildableContext)
      throws IOException;

  public RuleKey.Builder appendDetailsToRuleKey(RuleKey.Builder builder) throws IOException;

  /**
   * Currently, this is used by {@link AbstractCachingBuildRule} to determine which files should be
   * be included in the {@link BuildInfoRecorder}. Ultimately, a {@link Buildable} should be
   * responsible for updating the {@link BuildInfoRecorder} itself in its
   * {@link #getBuildSteps(BuildContext, BuildableContext)} method. The use of this method should be
   * restricted to things like {@code buck targets --show_output}.
   *
   * @return the relative path to the primary output of the build rule. If non-null, this path must
   *     identify a single file (as opposed to a directory).
   */
  @Nullable
  public String getPathToOutputFile();
}
