mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
Use generics in utils.Merge (#24264)
This commit is contained in:
parent
f231124f2d
commit
95b76e42ad
@ -36,31 +36,27 @@ type MergeConfig struct {
|
|||||||
// retTS := ret.(testStruct)
|
// retTS := ret.(testStruct)
|
||||||
// return &retTS, nil
|
// return &retTS, nil
|
||||||
// }
|
// }
|
||||||
func Merge(base any, patch any, mergeConfig *MergeConfig) (any, error) {
|
func Merge[T any](base T, patch T, mergeConfig *MergeConfig) (T, error) {
|
||||||
if reflect.TypeOf(base) != reflect.TypeOf(patch) {
|
|
||||||
return nil, fmt.Errorf(
|
|
||||||
"cannot merge different types. base type: %s, patch type: %s",
|
|
||||||
reflect.TypeOf(base),
|
|
||||||
reflect.TypeOf(patch),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
commonType := reflect.TypeOf(base)
|
commonType := reflect.TypeOf(base)
|
||||||
baseVal := reflect.ValueOf(base)
|
baseVal := reflect.ValueOf(base)
|
||||||
patchVal := reflect.ValueOf(patch)
|
patchVal := reflect.ValueOf(patch)
|
||||||
if commonType.Kind() == reflect.Ptr {
|
|
||||||
commonType = commonType.Elem()
|
|
||||||
baseVal = baseVal.Elem()
|
|
||||||
patchVal = patchVal.Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := reflect.New(commonType)
|
ret := reflect.New(commonType)
|
||||||
|
|
||||||
val, ok := merge(baseVal, patchVal, mergeConfig)
|
val, ok := merge(baseVal, patchVal, mergeConfig)
|
||||||
if ok {
|
if ok {
|
||||||
ret.Elem().Set(val)
|
ret.Elem().Set(val)
|
||||||
}
|
}
|
||||||
return ret.Elem().Interface(), nil
|
|
||||||
|
r, ok := ret.Elem().Interface().(T)
|
||||||
|
if !ok {
|
||||||
|
return r, fmt.Errorf(
|
||||||
|
"Unexpected type of return element, expected %s, is %s",
|
||||||
|
commonType,
|
||||||
|
reflect.TypeOf(r),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge recursively merges patch into base and returns the new struct, ptr, slice/map, or value
|
// merge recursively merges patch into base and returns the new struct, ptr, slice/map, or value
|
||||||
|
@ -1549,8 +1549,8 @@ func mergeSimple(base, patch simple) (*simple, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retS := ret.(simple)
|
|
||||||
return &retS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeEvenSimpler(base, patch evenSimpler) (*evenSimpler, error) {
|
func mergeEvenSimpler(base, patch evenSimpler) (*evenSimpler, error) {
|
||||||
@ -1558,8 +1558,8 @@ func mergeEvenSimpler(base, patch evenSimpler) (*evenSimpler, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(evenSimpler)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeEvenSimplerWithConfig(base, patch evenSimpler, mergeConfig *utils.MergeConfig) (*evenSimpler, error) {
|
func mergeEvenSimplerWithConfig(base, patch evenSimpler, mergeConfig *utils.MergeConfig) (*evenSimpler, error) {
|
||||||
@ -1567,8 +1567,8 @@ func mergeEvenSimplerWithConfig(base, patch evenSimpler, mergeConfig *utils.Merg
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(evenSimpler)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeSliceStruct(base, patch sliceStruct) (*sliceStruct, error) {
|
func mergeSliceStruct(base, patch sliceStruct) (*sliceStruct, error) {
|
||||||
@ -1576,8 +1576,8 @@ func mergeSliceStruct(base, patch sliceStruct) (*sliceStruct, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(sliceStruct)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeMapPtr(base, patch mapPtr) (*mapPtr, error) {
|
func mergeMapPtr(base, patch mapPtr) (*mapPtr, error) {
|
||||||
@ -1585,8 +1585,8 @@ func mergeMapPtr(base, patch mapPtr) (*mapPtr, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(mapPtr)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeMapPtrState(base, patch mapPtrState) (*mapPtrState, error) {
|
func mergeMapPtrState(base, patch mapPtrState) (*mapPtrState, error) {
|
||||||
@ -1594,8 +1594,8 @@ func mergeMapPtrState(base, patch mapPtrState) (*mapPtrState, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(mapPtrState)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeMapPtrState2(base, patch mapPtrState2) (*mapPtrState2, error) {
|
func mergeMapPtrState2(base, patch mapPtrState2) (*mapPtrState2, error) {
|
||||||
@ -1603,8 +1603,8 @@ func mergeMapPtrState2(base, patch mapPtrState2) (*mapPtrState2, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(mapPtrState2)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeTestStructs(base, patch testStruct) (*testStruct, error) {
|
func mergeTestStructs(base, patch testStruct) (*testStruct, error) {
|
||||||
@ -1612,71 +1612,36 @@ func mergeTestStructs(base, patch testStruct) (*testStruct, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
retTS := ret.(testStruct)
|
|
||||||
return &retTS, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeStringIntMap(base, patch map[string]int) (map[string]int, error) {
|
func mergeStringIntMap(base, patch map[string]int) (map[string]int, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.(map[string]int)
|
|
||||||
return retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeStringPtrIntMap(base, patch map[string]*int) (map[string]*int, error) {
|
func mergeStringPtrIntMap(base, patch map[string]*int) (map[string]*int, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.(map[string]*int)
|
|
||||||
return retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeStringSliceIntMap(base, patch map[string][]int) (map[string][]int, error) {
|
func mergeStringSliceIntMap(base, patch map[string][]int) (map[string][]int, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.(map[string][]int)
|
|
||||||
return retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeMapOfMap(base, patch map[string]map[string]*int) (map[string]map[string]*int, error) {
|
func mergeMapOfMap(base, patch map[string]map[string]*int) (map[string]map[string]*int, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.(map[string]map[string]*int)
|
|
||||||
return retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeInterfaceMap(base, patch map[string]any) (map[string]any, error) {
|
func mergeInterfaceMap(base, patch map[string]any) (map[string]any, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.(map[string]any)
|
|
||||||
return retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeStringSlices(base, patch []string) ([]string, error) {
|
func mergeStringSlices(base, patch []string) ([]string, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.([]string)
|
|
||||||
return retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeTestStructsPtrs(base, patch *testStruct) (*testStruct, error) {
|
func mergeTestStructsPtrs(base, patch *testStruct) (*testStruct, error) {
|
||||||
ret, err := utils.Merge(base, patch, nil)
|
return utils.Merge(base, patch, nil)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retTS := ret.(testStruct)
|
|
||||||
return &retTS, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBool(b bool) *bool { return &b }
|
func newBool(b bool) *bool { return &b }
|
||||||
|
@ -164,13 +164,7 @@ func FixInvalidLocales(cfg *model.Config) bool {
|
|||||||
// Merge merges two configs together. The receiver's values are overwritten with the patch's
|
// Merge merges two configs together. The receiver's values are overwritten with the patch's
|
||||||
// values except when the patch's values are nil.
|
// values except when the patch's values are nil.
|
||||||
func Merge(cfg *model.Config, patch *model.Config, mergeConfig *utils.MergeConfig) (*model.Config, error) {
|
func Merge(cfg *model.Config, patch *model.Config, mergeConfig *utils.MergeConfig) (*model.Config, error) {
|
||||||
ret, err := utils.Merge(cfg, patch, mergeConfig)
|
return utils.Merge(cfg, patch, mergeConfig)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
retCfg := ret.(model.Config)
|
|
||||||
return &retCfg, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsDatabaseDSN(dsn string) bool {
|
func IsDatabaseDSN(dsn string) bool {
|
||||||
|
Loading…
Reference in New Issue
Block a user