/*
 * 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.google.common.base.Preconditions;

import java.io.File;

/**
 * An {@link InputRule} that uses the {@link RuleKey} passed to its constructor rather than
 * computing the value from the underlying file contents.
 */
public class FakeInputRule extends InputRule {

  private final RuleKey customRuleKey;

  private FakeInputRule(File inputFile, RuleKey customRuleKey) {
    super(inputFile, inputFile.getPath());
    this.customRuleKey = Preconditions.checkNotNull(customRuleKey);
  }

  @Override
  public RuleKey getRuleKey() {
    return customRuleKey;
  }

  public static InputRule createWithRuleKey(String absolutePath, RuleKey customRuleKey) {
    return new FakeInputRule(new File(absolutePath), Preconditions.checkNotNull(customRuleKey));
  }
}
