package pgtype

import (
	
	
)

type MacaddrCodec struct{}

func (MacaddrCodec) ( int16) bool {
	return  == TextFormatCode ||  == BinaryFormatCode
}

func (MacaddrCodec) () int16 {
	return BinaryFormatCode
}

func (MacaddrCodec) ( *Map,  uint32,  int16,  any) EncodePlan {
	switch  {
	case BinaryFormatCode:
		switch .(type) {
		case net.HardwareAddr:
			return encodePlanMacaddrCodecBinaryHardwareAddr{}
		case TextValuer:
			return encodePlanMacAddrCodecTextValuer{}

		}
	case TextFormatCode:
		switch .(type) {
		case net.HardwareAddr:
			return encodePlanMacaddrCodecTextHardwareAddr{}
		case TextValuer:
			return encodePlanTextCodecTextValuer{}
		}
	}

	return nil
}

type encodePlanMacaddrCodecBinaryHardwareAddr struct{}

func (encodePlanMacaddrCodecBinaryHardwareAddr) ( any,  []byte) ( []byte,  error) {
	 := .(net.HardwareAddr)
	if  == nil {
		return nil, nil
	}

	return append(, ...), nil
}

type encodePlanMacAddrCodecTextValuer struct{}

func (encodePlanMacAddrCodecTextValuer) ( any,  []byte) ( []byte,  error) {
	,  := .(TextValuer).TextValue()
	if  != nil {
		return nil, 
	}
	if !.Valid {
		return nil, nil
	}

	,  := net.ParseMAC(.String)
	if  != nil {
		return nil, 
	}

	return append(, ...), nil
}

type encodePlanMacaddrCodecTextHardwareAddr struct{}

func (encodePlanMacaddrCodecTextHardwareAddr) ( any,  []byte) ( []byte,  error) {
	 := .(net.HardwareAddr)
	if  == nil {
		return nil, nil
	}

	return append(, .String()...), nil
}

func (MacaddrCodec) ( *Map,  uint32,  int16,  any) ScanPlan {
	switch  {
	case BinaryFormatCode:
		switch .(type) {
		case *net.HardwareAddr:
			return scanPlanBinaryMacaddrToHardwareAddr{}
		case TextScanner:
			return scanPlanBinaryMacaddrToTextScanner{}
		}
	case TextFormatCode:
		switch .(type) {
		case *net.HardwareAddr:
			return scanPlanTextMacaddrToHardwareAddr{}
		case TextScanner:
			return scanPlanTextAnyToTextScanner{}
		}
	}

	return nil
}

type scanPlanBinaryMacaddrToHardwareAddr struct{}

func (scanPlanBinaryMacaddrToHardwareAddr) ( []byte,  any) error {
	 := .(*net.HardwareAddr)
	if  == nil {
		* = nil
		return nil
	}

	* = make([]byte, len())
	copy(*, )
	return nil
}

type scanPlanBinaryMacaddrToTextScanner struct{}

func (scanPlanBinaryMacaddrToTextScanner) ( []byte,  any) error {
	 := ().(TextScanner)
	if  == nil {
		return .ScanText(Text{})
	}

	return .ScanText(Text{String: net.HardwareAddr().String(), Valid: true})
}

type scanPlanTextMacaddrToHardwareAddr struct{}

func (scanPlanTextMacaddrToHardwareAddr) ( []byte,  any) error {
	 := .(*net.HardwareAddr)

	if  == nil {
		* = nil
		return nil
	}

	,  := net.ParseMAC(string())
	if  != nil {
		return 
	}

	* = 

	return nil
}

func ( MacaddrCodec) ( *Map,  uint32,  int16,  []byte) (driver.Value, error) {
	return codecDecodeToTextFormat(, , , , )
}

func ( MacaddrCodec) ( *Map,  uint32,  int16,  []byte) (any, error) {
	if  == nil {
		return nil, nil
	}

	var  net.HardwareAddr
	 := codecScan(, , , , , &)
	if  != nil {
		return nil, 
	}
	return , nil
}