text: # Author:
  #  Romain Bentz (pixis - @hackanddo)
  # Website:
  #  https://beta.hackndo.com
  
  # Generic Errors
  ERROR_SUCCESS                       = (0, "")
  ERROR_MISSING_ARGUMENTS             = (1, "")
  ERROR_USER_FILE_NOT_FOUND           = (2, "Users file does not exist")
  ERROR_NO_USER_NO_LDAP               = (3, "Either provide ldap credentials or user(s)")
  ERROR_THRESHOLD                     = (4, "Bad password count reached threshold")
  
  # Neo4J Errors
  ERROR_NEO4J_CREDENTIALS             = (100, "Neo4j credentials are not valid")
  ERROR_NEO4J_SERVICE_UNAVAILABLE     = (101, "Neo4j is not available")
  ERROR_NEO4J_NON_EXISTENT_NODE       = (102, "Node does not exist in database")
  ERROR_NO_PATH                       = (103, "No admin path from this node")
  ERROR_NEO4J_UNEXPECTED              = (199, "Unexpected error with Neo4J")
  
  # Ldap Errors
  ERROR_LDAP_CREDENTIALS              = (200, "Ldap credentials are not valid")
  ERROR_LDAP_SERVICE_UNAVAILABLE      = (201, "Ldap is not available")
  ERROR_LDAP_NO_CREDENTIALS           = (202, "No credentials provided")
  ERROR_LDAP_NOT_FQDN_DOMAIN          = (203, "Invalid domain")
  ERROR_LDAP_UNEXPECTED               = (299, "Unexpected error with Ldap")
  
  
  ERROR_UNDEFINED                     = (-1, "Unknown error")
  
  
  class RetCode:
      def __init__(self, error, exception=None):
          self.error_code = error[0]
          self.error_msg = error[1]
          self.error_exception = exception
  
      def success(self):
          return self.error_code == 0
  
      def __str__(self):
          return "{} : {}".format(self.error_code, self.error_msg)
  
      def __eq__(self, other):
          if isinstance(other, RetCode):
              return self.error_code == other.error_code
          elif isinstance(other, int):
              return self.error_code == other
          elif isinstance(other, tuple):
              return self.error_code == other[0]
          return NotImplemented
  
      def __ne__(self, other):
          x = self.__eq__(other)
          if x is not NotImplemented:
              return not x
          return NotImplemented
  
      def __hash__(self):
          return hash(tuple(sorted(self.__dict__.items())))