/*
 * 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.model.Flavor;

/**
 * The Source of Truth about a {@link BuildRule}, providing mechanisms to expose the arguments that
 * rules derived from the Buildable take and providing a factory for those BuildRules. It is
 * expected that instances of this class are stateless.
 *
 * @param <T> The object describing the parameters to be passed to the {@link BuildRule}. How this
 *     is processed is described in the class level javadoc of {@link ConstructorArgMarshaller}.
 *
 */
public interface Description<T> {

  /**
   * @return The {@link BuildRuleType} being described.
   */
  BuildRuleType getBuildRuleType();

  /**
   * @return An instance of the argument that must later be passed to createBuildRule().
   * @see ConstructorArgMarshaller
   *
   */
  T createUnpopulatedConstructorArg();

  /**
   * Create a {@link BuildRule} for the given {@link BuildRuleParams}. Note that the
   * {@link com.facebook.buck.model.BuildTarget} referred to in the {@code params} contains the
   * {@link Flavor} to create.
   *
   * @param resolver For querying for build rules by their targets.
   * @param args A constructor argument, as returned by {@link #createUnpopulatedConstructorArg()}.
   * @return The {@link BuildRule} that describes the default flavour of the rule being described.
   */
  <A extends T> BuildRule createBuildRule(
      BuildRuleParams params,
      BuildRuleResolver resolver,
      A args);
}
