content: // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
  //  This source code is licensed under both the GPLv2 (found in the
  //  COPYING file in the root directory) and Apache 2.0 License
  //  (found in the LICENSE.Apache file in the root directory).
  
  package org.rocksdb;
  
  /**
   * Represents the status returned by a function call in RocksDB.
   *
   * Currently only used with {@link RocksDBException} when the
   * status is not {@link Code#Ok}
   */
  public class Status {
    private final Code code;
    /* @Nullable */ private final SubCode subCode;
    /* @Nullable */ private final String state;
  
    public Status(final Code code, final SubCode subCode, final String state) {
      this.code = code;
      this.subCode = subCode;
      this.state = state;
    }
  
    /**
     * Intentionally private as this will be called from JNI
     */
    private Status(final byte code, final byte subCode, final String state) {
      this.code = Code.getCode(code);
      this.subCode = SubCode.getSubCode(subCode);
      this.state = state;
    }
  
    public Code getCode() {
      return code;
    }
  
    public SubCode getSubCode() {
      return subCode;
    }
  
    public String getState() {
      return state;
    }
  
    public String getCodeString() {
      final StringBuilder builder = new StringBuilder()
          .append(code.name());
      if(subCode != null && subCode != SubCode.None) {
        builder.append("(")
            .append(subCode.name())
            .append(")");
      }
      return builder.toString();
    }
  
    public enum Code {
      Ok(                 (byte)0x0),
      NotFound(           (byte)0x1),
      Corruption(         (byte)0x2),
      NotSupported(       (byte)0x3),
      InvalidArgument(    (byte)0x4),
      IOError(            (byte)0x5),
      MergeInProgress(    (byte)0x6),
      Incomplete(         (byte)0x7),
      ShutdownInProgress( (byte)0x8),
      TimedOut(           (byte)0x9),
      Aborted(            (byte)0xA),
      Busy(               (byte)0xB),
      Expired(            (byte)0xC),
      TryAgain(           (byte)0xD);
  
      private final byte value;
  
      Code(final byte value) {
        this.value = value;
      }
  
      public static Code getCode(final byte value) {
        for (final Code code : Code.values()) {
          if (code.value == value){
            return code;
          }
        }
        throw new IllegalArgumentException(
            "Illegal value provided for Code.");
      }
    }
  
    public enum SubCode {
      None(         (byte)0x0),
      MutexTimeout( (byte)0x1),
      LockTimeout(  (byte)0x2),
      LockLimit(    (byte)0x3),
      MaxSubCode(   (byte)0x7E);
  
      private final byte value;
  
      SubCode(final byte value) {
        this.value = value;
      }
  
      public static SubCode getSubCode(final byte value) {
        for (final SubCode subCode : SubCode.values()) {
          if (subCode.value == value){
            return subCode;
          }
        }
        throw new IllegalArgumentException(
            "Illegal value provided for SubCode.");
      }
    }
  }
  