package hook

import (
	"reflect"

	"github.com/mitchellh/mapstructure"
	"golang.org/x/exp/constraints"
)

func EnumHookFunc[T constraints.Integer](resolve func(string) (T, error)) mapstructure.DecodeHookFuncType {
	return func(
		f reflect.Type,
		t reflect.Type,
		data interface{},
	) (interface{}, error) {
		if f.Kind() != reflect.String {
			return data, nil
		}
		if t != reflect.TypeOf(T(0)) {
			return data, nil
		}
		return resolve(data.(string))
	}
}