package avro

import (
	
	
	
	

	
)

// TypeResolver resolves types by name.
type TypeResolver struct {
	names sync.Map // map[string]reflect2.Type
	types sync.Map // map[int][]string
}

// NewTypeResolver creates a new type resolver with all primitive types
// registered.
func () *TypeResolver {
	 := &TypeResolver{}

	// Register basic types
	.Register(string(Null), &null{})
	.Register(string(Int), int8(0))
	.Register(string(Int), int16(0))
	.Register(string(Int), int32(0))
	.Register(string(Int), int(0))
	.Register(string(Long), int(0))
	.Register(string(Long), int64(0))
	.Register(string(Float), float32(0))
	.Register(string(Double), float64(0))
	.Register(string(String), "")
	.Register(string(Bytes), []byte{})
	.Register(string(Boolean), true)

	// Register logical types
	.Register(string(Int)+"."+string(Date), time.Time{})
	.Register(string(Int)+"."+string(TimeMillis), time.Duration(0))
	.Register(string(Long)+"."+string(TimestampMillis), time.Time{})
	.Register(string(Long)+"."+string(TimestampMicros), time.Time{})
	.Register(string(Long)+"."+string(TimeMicros), time.Duration(0))
	.Register(string(Bytes)+"."+string(Decimal), big.NewRat(1, 1))
	.Register(string(String)+"."+string(UUID), "")

	return 
}

// Register registers names to their types for resolution.
func ( *TypeResolver) ( string,  any) {
	 := reflect2.TypeOf()
	 := .RType()

	.names.Store(, )

	,  := .types.LoadOrStore(, []string{})
	if ! {
		return
	}
	 := .([]string)
	 = append(, )
	.types.Store(, )
}

// Name gets the name for a type, or an error.
func ( *TypeResolver) ( reflect2.Type) ([]string, error) {
	 := .RType()

	,  := .types.Load()
	if ! {
		return nil, fmt.Errorf("avro: unable to resolve type %s", .String())
	}

	return .([]string), nil
}

// Type gets the type for a name, or an error.
func ( *TypeResolver) ( string) (reflect2.Type, error) {
	,  := .names.Load()
	if ! {
		return nil, fmt.Errorf("avro: unable to resolve type with name %s", )
	}

	return .(reflect2.Type), nil
}

// Register registers names to their types for resolution. All primitive types are pre-registered.
func ( string,  any) {
	DefaultConfig.Register(, )
}