// Code generated by "stringer -type=Status -output=types_string.go"; DO NOT EDIT.

package zx

import "strconv"

func _() {
	// An "invalid array index" compiler error signifies that the constant values have changed.
	// Re-run the stringer command to generate them again.
	var x [1]struct{}
	_ = x[ErrOk-0]
	_ = x[ErrInternal - -1]
	_ = x[ErrNotSupported - -2]
	_ = x[ErrNoResources - -3]
	_ = x[ErrNoMemory - -4]
	_ = x[ErrCallFailed - -5]
	_ = x[ErrInterruptedRetry - -6]
	_ = x[ErrInvalidArgs - -10]
	_ = x[ErrBadHandle - -11]
	_ = x[ErrWrongType - -12]
	_ = x[ErrBadSyscall - -13]
	_ = x[ErrOutOfRange - -14]
	_ = x[ErrBufferTooSmall - -15]
	_ = x[ErrBadState - -20]
	_ = x[ErrTimedOut - -21]
	_ = x[ErrShouldWait - -22]
	_ = x[ErrCanceled - -23]
	_ = x[ErrPeerClosed - -24]
	_ = x[ErrNotFound - -25]
	_ = x[ErrAlreadyExists - -26]
	_ = x[ErrAlreadyBound - -27]
	_ = x[ErrUnavailable - -28]
	_ = x[ErrAccessDenied - -30]
	_ = x[ErrIO - -40]
	_ = x[ErrIORefused - -41]
	_ = x[ErrIODataIntegrity - -42]
	_ = x[ErrIODataLoss - -43]
	_ = x[ErrIONotPresent - -44]
	_ = x[ErrBadPath - -50]
	_ = x[ErrNotDir - -51]
	_ = x[ErrNotFile - -52]
	_ = x[ErrFileBig - -53]
	_ = x[ErrNoSpace - -54]
	_ = x[ErrNotEmpty - -55]
	_ = x[ErrStop - -60]
	_ = x[ErrNext - -61]
	_ = x[ErrProtocolNotSupported - -70]
	_ = x[ErrAddressUnreachable - -71]
	_ = x[ErrAddressInUse - -72]
	_ = x[ErrNotConnected - -73]
	_ = x[ErrConnectionRefused - -74]
	_ = x[ErrConnectionReset - -75]
	_ = x[ErrConnectionAborted - -76]
}

const (
	_Status_name_0 = "ErrConnectionAbortedErrConnectionResetErrConnectionRefusedErrNotConnectedErrAddressInUseErrAddressUnreachableErrProtocolNotSupported"
	_Status_name_1 = "ErrNextErrStop"
	_Status_name_2 = "ErrNotEmptyErrNoSpaceErrFileBigErrNotFileErrNotDirErrBadPath"
	_Status_name_3 = "ErrIONotPresentErrIODataLossErrIODataIntegrityErrIORefusedErrIO"
	_Status_name_4 = "ErrAccessDenied"
	_Status_name_5 = "ErrUnavailableErrAlreadyBoundErrAlreadyExistsErrNotFoundErrPeerClosedErrCanceledErrShouldWaitErrTimedOutErrBadState"
	_Status_name_6 = "ErrBufferTooSmallErrOutOfRangeErrBadSyscallErrWrongTypeErrBadHandleErrInvalidArgs"
	_Status_name_7 = "ErrInterruptedRetryErrCallFailedErrNoMemoryErrNoResourcesErrNotSupportedErrInternalErrOk"
)

var (
	_Status_index_0 = [...]uint8{0, 20, 38, 58, 73, 88, 109, 132}
	_Status_index_1 = [...]uint8{0, 7, 14}
	_Status_index_2 = [...]uint8{0, 11, 21, 31, 41, 50, 60}
	_Status_index_3 = [...]uint8{0, 15, 28, 46, 58, 63}
	_Status_index_5 = [...]uint8{0, 14, 29, 45, 56, 69, 80, 93, 104, 115}
	_Status_index_6 = [...]uint8{0, 17, 30, 43, 55, 67, 81}
	_Status_index_7 = [...]uint8{0, 19, 32, 43, 57, 72, 83, 88}
)

func (i Status) String() string {
	switch {
	case -76 <= i && i <= -70:
		i -= -76
		return _Status_name_0[_Status_index_0[i]:_Status_index_0[i+1]]
	case -61 <= i && i <= -60:
		i -= -61
		return _Status_name_1[_Status_index_1[i]:_Status_index_1[i+1]]
	case -55 <= i && i <= -50:
		i -= -55
		return _Status_name_2[_Status_index_2[i]:_Status_index_2[i+1]]
	case -44 <= i && i <= -40:
		i -= -44
		return _Status_name_3[_Status_index_3[i]:_Status_index_3[i+1]]
	case i == -30:
		return _Status_name_4
	case -28 <= i && i <= -20:
		i -= -28
		return _Status_name_5[_Status_index_5[i]:_Status_index_5[i+1]]
	case -15 <= i && i <= -10:
		i -= -15
		return _Status_name_6[_Status_index_6[i]:_Status_index_6[i+1]]
	case -6 <= i && i <= 0:
		i -= -6
		return _Status_name_7[_Status_index_7[i]:_Status_index_7[i+1]]
	default:
		return "Status(" + strconv.FormatInt(int64(i), 10) + ")"
	}
}
