/*
 * 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;

public class BuildableProperties {
  public final static BuildableProperties NONE = new BuildableProperties();

  public static enum Kind {
    /**
     * Whether this rule exists only in an Android project.
     */
    ANDROID(1),
    LIBRARY(2),

    /**
     * Whether or not this rule is considered a packaging rule.  Packaging rules
     *   (like java_binary) are rules that package up all of their transitive dependencies in their
     *   final output.
     */
    PACKAGING(4),
    TEST(8);

    private final int code;

    private Kind(int code) {
      this.code = code;
    }
  }

  private int code;

  public BuildableProperties(Kind primaryKind, Kind... kinds) {
    Preconditions.checkNotNull(primaryKind);
    code = primaryKind.code;
    for (Kind kind : kinds) {
      code |= kind.code;
    }
  }

  private BuildableProperties() {
    code = -1;
  }

  public boolean is(Kind kind) {
    return kind.code == (code & kind.code);
  }
}
