package pgtype

import (
	
	
	
	
)

type UUID struct {
	Bytes  [16]byte
	Status Status
}

func ( *UUID) ( interface{}) error {
	if  == nil {
		* = UUID{Status: Null}
		return nil
	}

	if ,  := .(interface{ () interface{} });  {
		 := .()
		if  !=  {
			return .()
		}
	}

	switch value := .(type) {
	case [16]byte:
		* = UUID{Bytes: , Status: Present}
	case []byte:
		if  != nil {
			if len() != 16 {
				return fmt.Errorf("[]byte must be 16 bytes to convert to UUID: %d", len())
			}
			* = UUID{Status: Present}
			copy(.Bytes[:], )
		} else {
			* = UUID{Status: Null}
		}
	case string:
		,  := parseUUID()
		if  != nil {
			return 
		}
		* = UUID{Bytes: , Status: Present}
	case *string:
		if  == nil {
			* = UUID{Status: Null}
		} else {
			return .(*)
		}
	default:
		if ,  := underlyingUUIDType();  {
			return .()
		}
		return fmt.Errorf("cannot convert %v to UUID", )
	}

	return nil
}

func ( UUID) () interface{} {
	switch .Status {
	case Present:
		return .Bytes
	case Null:
		return nil
	default:
		return .Status
	}
}

func ( *UUID) ( interface{}) error {
	switch .Status {
	case Present:
		switch v := .(type) {
		case *[16]byte:
			* = .Bytes
			return nil
		case *[]byte:
			* = make([]byte, 16)
			copy(*, .Bytes[:])
			return nil
		case *string:
			* = encodeUUID(.Bytes)
			return nil
		default:
			if ,  := GetAssignToDstType();  {
				return .()
			}
		}
	case Null:
		return NullAssignTo()
	}

	return fmt.Errorf("cannot assign %v into %T", , )
}
parseUUID converts a string UUID in standard form to a byte array.
func ( string) ( [16]byte,  error) {
	switch len() {
	case 36:
		 = [0:8] + [9:13] + [14:18] + [19:23] + [24:]
dashes already stripped, assume valid
assume invalid.
		return , fmt.Errorf("cannot parse UUID %v", )
	}

	,  := hex.DecodeString()
	if  != nil {
		return , 
	}

	copy([:], )
	return , 
}
encodeUUID converts a uuid byte array to UUID standard string form.
func ( [16]byte) string {
	return fmt.Sprintf("%x-%x-%x-%x-%x", [0:4], [4:6], [6:8], [8:10], [10:16])
}

func ( *UUID) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = UUID{Status: Null}
		return nil
	}

	if len() != 36 {
		return fmt.Errorf("invalid length for UUID: %v", len())
	}

	,  := parseUUID(string())
	if  != nil {
		return 
	}

	* = UUID{Bytes: , Status: Present}
	return nil
}

func ( *UUID) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = UUID{Status: Null}
		return nil
	}

	if len() != 16 {
		return fmt.Errorf("invalid length for UUID: %v", len())
	}

	* = UUID{Status: Present}
	copy(.Bytes[:], )
	return nil
}

func ( UUID) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	return append(, encodeUUID(.Bytes)...), nil
}

func ( UUID) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	return append(, .Bytes[:]...), nil
}
Scan implements the database/sql Scanner interface.
func ( *UUID) ( interface{}) error {
	if  == nil {
		* = UUID{Status: Null}
		return nil
	}

	switch src := .(type) {
	case string:
		return .DecodeText(nil, []byte())
	case []byte:
		 := make([]byte, len())
		copy(, )
		return .DecodeText(nil, )
	}

	return fmt.Errorf("cannot scan %T", )
}
Value implements the database/sql/driver Valuer interface.
func ( UUID) () (driver.Value, error) {
	return EncodeValueText()
}

func ( UUID) () ([]byte, error) {
	switch .Status {
	case Present:
		var  bytes.Buffer
		.WriteByte('"')
		.WriteString(encodeUUID(.Bytes))
		.WriteByte('"')
		return .Bytes(), nil
	case Null:
		return []byte("null"), nil
	case Undefined:
		return nil, errUndefined
	}
	return nil, errBadStatus
}

func ( *UUID) ( []byte) error {
	if bytes.Compare(, []byte("null")) == 0 {
		return .Set(nil)
	}
	if len() != 38 {
		return fmt.Errorf("invalid length for UUID: %v", len())
	}
	return .Set(string([1 : len()-1]))