"""MacOS Darwin helpers."""


class DarwinSystemErrorHelper:
  """Darwin system error helper.

  Also see:
    https://github.com/apple/darwin-xnu/blob/main/bsd/sys/errno.h
  """

  _ERROR_CODES = {
      -1: 'Restart syscall',
      -2: 'Don\'t modify regs, just return',
      -5: 'Restart lookup under heavy vnode pressure/recycling',
      -6: 'Red drive open',
      -7: 'Keep looking',
      -8: 'Data less',
      0: 'Success',
      1: 'Operation not permitted',
      2: 'No such file or directory',
      3: 'No such process',
      4: 'Interrupted system call',
      5: 'Input/Output error',
      6: 'Device not configured',
      7: 'Argument list too long',
      8: 'Exec format error',
      9: 'Bad file descriptor',
      10: 'No child processes',
      11: 'Resource deadlock avoided',
      12: 'Cannot allocate memory',
      13: 'Permission denied',
      14: 'Bad address',
      15: 'Block device required',
      16: 'Device / Resource busy',
      17: 'File exists',
      18: 'Cross-device link',
      19: 'Operation not supported by device',
      20: 'Not a directory',
      21: 'Is a directory',
      22: 'Invalid argument',
      23: 'Too many open files in system',
      24: 'Too many open files',
      25: 'Inappropriate ioctl for devices',
      26: 'Text file busy',
      27: 'File too large',
      28: 'No space left on device',
      29: 'Illegal seek',
      30: 'Read-only filesystem',
      31: 'Too many links',
      32: 'Broken pipe',
      33: 'Numerical argument out of domain',
      34: 'Result too large',
      35: 'Resource temporarily unavailable, operation would block',
      36: 'Operation now in progress',
      37: 'Operation already in progress',
      38: 'Socket operation on non-socket',
      39: 'Destination address required',
      40: 'Message too long',
      41: 'Protocol wrong type for socket',
      42: 'Protocol not available',
      43: 'Protocol not supported',
      44: 'Socket type not supported',
      45: 'Operation not supported, Operation not supported on socket',
      46: 'Protocol family not supported',
      47: 'Address family not supported by protocol family',
      48: 'Address already in use',
      49: 'Can\'t assign requested address',
      50: 'Network is down',
      51: 'Network is unreachable',
      52: 'Network dropped connection on reset',
      53: 'Software caused connection abort',
      54: 'Connection reset by peer',
      55: 'No buffer space available',
      56: 'Socket is already connected',
      57: 'Socket is not connected',
      58: 'Can\'t send after socket shutdown',
      59: 'Too many references: can\'t splice',
      60: 'Operation timed out',
      61: 'Connection refused',
      62: 'Too many levels of symbolic links',
      63: 'File name too long',
      64: 'Host is down',
      65: 'No route to host',
      66: 'Directory not empty',
      67: 'Too many processes',
      68: 'Too many users',
      69: 'Disc quota exceeded',
      70: 'Stale NFS file handle',
      71: 'Too many levels of remote in path',
      72: 'RPC struct is bad',
      73: 'RPC version wrong',
      74: 'RPC prog. not avail',
      75: 'Program version wrong',
      76: 'Bad procedure for program',
      77: 'No locks available',
      78: 'Function not implemented',
      79: 'Inappropriate file type or format',
      80: 'Authentication error',
      81: 'Need authenticator',
      82: 'Device power is off',
      83: 'Device error, e.g. paper out',
      84: 'Value too large to be stored in data type',
      85: 'Bad executable',
      86: 'Bad CPU type in executable',
      87: 'Shared library version mismatch',
      88: 'Malformed Macho file',
      89: 'Operation canceled',
      90: 'Identifier removed',
      91: 'No message of desired type',
      92: 'Illegal byte sequence',
      93: 'Attribute not found',
      94: 'Bad message',
      95: 'Reserved',
      96: 'No message available on STREAM',
      97: 'Reserved',
      98: 'No STREAM resources',
      99: 'Not a STREAM',
      100: 'Protocol error',
      101: 'STREAM ioctl timeout',
      102: 'Operation not supported on socket',
      103: 'No such policy registered',
      104: 'State not recoverable',
      105: 'Previous owner died',
      106: 'Interface output queue is full, Must be equal largest errno'}

  @classmethod
  def GetDescription(cls, error_code):
    """Retrieves the description of a specific error code.

    Args:
      error_code (int): error code.

    Returns:
      str: description of the error.
    """
    return cls._ERROR_CODES.get(error_code, f'UNKNOWN: {error_code:d}')
