/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/**
 * Autogenerated by Thrift Compiler (0.18.1)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.airavata.model.user;


@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.18.1)")
public enum Status implements org.apache.thrift.TEnum {
  ACTIVE(0),
  CONFIRMED(1),
  APPROVED(2),
  DELETED(3),
  DUPLICATE(4),
  GRACE_PERIOD(5),
  INVITED(6),
  DENIED(7),
  PENDING(8),
  PENDING_APPROVAL(9),
  PENDING_CONFIRMATION(10),
  SUSPENDED(11),
  DECLINED(12),
  EXPIRED(13);

  private final int value;

  private Status(int value) {
    this.value = value;
  }

  /**
   * Get the integer value of this enum value, as defined in the Thrift IDL.
   */
  @Override
  public int getValue() {
    return value;
  }

  /**
   * Find a the enum type by its integer value, as defined in the Thrift IDL.
   * @return null if the value is not found.
   */
  @org.apache.thrift.annotation.Nullable
  public static Status findByValue(int value) { 
    switch (value) {
      case 0:
        return ACTIVE;
      case 1:
        return CONFIRMED;
      case 2:
        return APPROVED;
      case 3:
        return DELETED;
      case 4:
        return DUPLICATE;
      case 5:
        return GRACE_PERIOD;
      case 6:
        return INVITED;
      case 7:
        return DENIED;
      case 8:
        return PENDING;
      case 9:
        return PENDING_APPROVAL;
      case 10:
        return PENDING_CONFIRMATION;
      case 11:
        return SUSPENDED;
      case 12:
        return DECLINED;
      case 13:
        return EXPIRED;
      default:
        return null;
    }
  }
}
