package avro

import (
	
	
	
	
	

	
)

func createDecoderOfEnum( *EnumSchema,  reflect2.Type) ValDecoder {
	switch {
	case .Kind() == reflect.String:
		return &enumCodec{enum: }
	case .Implements(textUnmarshalerType):
		return &enumTextMarshalerCodec{typ: , enum: }
	case reflect2.PtrTo().Implements(textUnmarshalerType):
		return &enumTextMarshalerCodec{typ: , enum: , ptr: true}
	}

	return &errorDecoder{err: fmt.Errorf("avro: %s is unsupported for Avro %s", .String(), .Type())}
}

func createEncoderOfEnum( *EnumSchema,  reflect2.Type) ValEncoder {
	switch {
	case .Kind() == reflect.String:
		return &enumCodec{enum: }
	case .Implements(textMarshalerType):
		return &enumTextMarshalerCodec{typ: , enum: }
	case reflect2.PtrTo().Implements(textMarshalerType):
		return &enumTextMarshalerCodec{typ: , enum: , ptr: true}
	}

	return &errorEncoder{err: fmt.Errorf("avro: %s is unsupported for Avro %s", .String(), .Type())}
}

type enumCodec struct {
	enum *EnumSchema
}

func ( *enumCodec) ( unsafe.Pointer,  *Reader) {
	 := int(.ReadInt())

	,  := .enum.Symbol()
	if ! {
		.ReportError("decode enum symbol", "unknown enum symbol")
		return
	}

	*((*string)()) = 
}

func ( *enumCodec) ( unsafe.Pointer,  *Writer) {
	 := *((*string)())
	for ,  := range .enum.symbols {
		if  !=  {
			continue
		}

		.WriteInt(int32())
		return
	}

	.Error = fmt.Errorf("avro: unknown enum symbol: %s", )
}

type enumTextMarshalerCodec struct {
	typ  reflect2.Type
	enum *EnumSchema
	ptr  bool
}

func ( *enumTextMarshalerCodec) ( unsafe.Pointer,  *Reader) {
	 := int(.ReadInt())

	,  := .enum.Symbol()
	if ! {
		.ReportError("decode enum symbol", "unknown enum symbol")
		return
	}

	var  any
	if .ptr {
		 = .typ.PackEFace()
	} else {
		 = .typ.UnsafeIndirect()
	}
	if reflect2.IsNil() {
		 := .typ.(*reflect2.UnsafePtrType)
		 := .Elem().UnsafeNew()
		*((*unsafe.Pointer)()) = 
		 = .typ.UnsafeIndirect()
	}
	 := ().(encoding.TextUnmarshaler)
	if  := .UnmarshalText([]byte());  != nil {
		.ReportError("decode enum text unmarshaler", .Error())
	}
}

func ( *enumTextMarshalerCodec) ( unsafe.Pointer,  *Writer) {
	var  any
	if .ptr {
		 = .typ.PackEFace()
	} else {
		 = .typ.UnsafeIndirect()
	}
	if .typ.IsNullable() && reflect2.IsNil() {
		.Error = errors.New("encoding nil enum text marshaler")
		return
	}
	 := ().(encoding.TextMarshaler)
	,  := .MarshalText()
	if  != nil {
		.Error = 
		return
	}

	 := string()
	for ,  := range .enum.symbols {
		if  !=  {
			continue
		}

		.WriteInt(int32())
		return
	}

	.Error = fmt.Errorf("avro: unknown enum symbol: %s", )
}