// Copyright 2018 The agentx authors
// Licensed under the LGPLv3 with static-linking exception.
// See LICENCE file for details.

package pdu

// The various pdu packet types.
const (
	TypeOpen            Type = 1
	TypeClose           Type = 2
	TypeRegister        Type = 3
	TypeUnregister      Type = 4
	TypeGet             Type = 5
	TypeGetNext         Type = 6
	TypeGetBulk         Type = 7
	TypeTestSet         Type = 8
	TypeCommitSet       Type = 9
	TypeUndoSet         Type = 10
	TypeCleanupSet      Type = 11
	TypeNotify          Type = 12
	TypePing            Type = 13
	TypeIndexAllocate   Type = 14
	TypeIndexDeallocate Type = 15
	TypeAddAgentCaps    Type = 16
	TypeRemoveAgentCaps Type = 17
	TypeResponse        Type = 18
)

// Type defines the pdu packet type.
type Type byte

// TypeOwner defines the interface for an object that provides a type.
type TypeOwner interface {
	Type() Type
}

func (t Type) String() string {
	switch t {
	case TypeOpen:
		return "TypeOpen"
	case TypeClose:
		return "TypeClose"
	case TypeRegister:
		return "TypeRegister"
	case TypeUnregister:
		return "TypeUnregister"
	case TypeGet:
		return "TypeGet"
	case TypeGetNext:
		return "TypeGetNext"
	case TypeGetBulk:
		return "TypeGetBulk"
	case TypeTestSet:
		return "TypeTestSet"
	case TypeCommitSet:
		return "TypeCommitSet"
	case TypeUndoSet:
		return "TypeUndoSet"
	case TypeCleanupSet:
		return "TypeCleanupSet"
	case TypeNotify:
		return "TypeNotify"
	case TypePing:
		return "TypePing"
	case TypeIndexAllocate:
		return "TypeIndexAllocate"
	case TypeIndexDeallocate:
		return "TypeIndexDeallocate"
	case TypeAddAgentCaps:
		return "TypeAddAgentCaps"
	case TypeRemoveAgentCaps:
		return "TypeRemoveAgentCaps"
	case TypeResponse:
		return "TypeResponse"
	}
	return "TypeUnknown"
}