// Copyright 2015 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.
package com.google.devtools.build.lib.pkgcache;

import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.packages.Target;
import java.util.Collection;

/**
 * The result of the loading phase, i.e., whether there were errors, and which targets were
 * successfully loaded, plus some related metadata.
 */
public final class LoadingResult {
  private final boolean hasTargetPatternError;
  private final boolean hasLoadingError;
  private final ImmutableSet<Target> targetsToAnalyze;
  private final ImmutableSet<Target> testsToRun;
  private final String workspaceName;

  public LoadingResult(boolean hasTargetPatternError, boolean hasLoadingError,
      Collection<Target> targetsToAnalyze, Collection<Target> testsToRun, String workspaceName) {
    this.hasTargetPatternError = hasTargetPatternError;
    this.hasLoadingError = hasLoadingError;
    this.targetsToAnalyze =
        targetsToAnalyze == null ? null : ImmutableSet.copyOf(targetsToAnalyze);
    this.testsToRun = testsToRun == null ? null : ImmutableSet.copyOf(testsToRun);
    this.workspaceName = workspaceName;
  }

  /** Whether there were errors during target pattern evaluation. */
  public boolean hasTargetPatternError() {
    return hasTargetPatternError;
  }

  /** Whether there were errors during the loading phase. */
  public boolean hasLoadingError() {
    return hasLoadingError;
  }

  /** Successfully loaded targets that should be built. */
  public Collection<Target> getTargets() {
    return targetsToAnalyze;
  }

  /** Successfully loaded targets that should be run as tests. Must be a subset of the targets. */
  public Collection<Target> getTestsToRun() {
    return testsToRun;
  }

  /** The name of the local workspace. */
  public String getWorkspaceName() {
    return workspaceName;
  }

  @Override
  public String toString() {
    return MoreObjects.toStringHelper(LoadingResult.class)
        .add("hasTargetPatternError", hasTargetPatternError)
        .add("hasLoadingError", hasLoadingError)
        .add("targetsToAnalyze", targetsToAnalyze)
        .add("testsToRun", testsToRun)
        .add("workspaceName", workspaceName)
        .toString();
  }
}
