// Package util ...
//
// Description : 从map中读取数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-11-16 4:28 下午
package util

import (
	"git.zhangdeman.cn/zhangdeman/gopkg/convert"
	"github.com/pkg/errors"
)

// Exist 检测一个key在map中是否存在
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 4:52 下午 2021/11/16
func Exist(source map[interface{}]interface{}, key interface{}) bool {
	if nil == source {
		return false
	}
	if _, exist := source[key]; !exist {
		return false
	}
	return true
}

// GetInt 获取int值
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 4:30 下午 2021/11/16
func GetInt(source map[interface{}]interface{}, key interface{}, defaultVal int) int {
	var result int
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetInt8 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 4:59 下午 2021/11/16
func GetInt8(source map[interface{}]interface{}, key interface{}, defaultVal int8) int8 {
	var result int8
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetInt16 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 4:59 下午 2021/11/16
func GetInt16(source map[interface{}]interface{}, key interface{}, defaultVal int16) int16 {
	var result int16
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetInt32 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:00 下午 2021/11/16
func GetInt32(source map[interface{}]interface{}, key interface{}, defaultVal int32) int32 {
	var result int32
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetInt64 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:00 下午 2021/11/16
func GetInt64(source map[interface{}]interface{}, key interface{}, defaultVal int64) int64 {
	var result int64
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetUint ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:01 下午 2021/11/16
func GetUint(source map[interface{}]interface{}, key interface{}, defaultVal uint) uint {
	var result uint
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetUint8 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:01 下午 2021/11/16
func GetUint8(source map[interface{}]interface{}, key interface{}, defaultVal uint8) uint8 {
	var result uint8
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetUint16 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:02 下午 2021/11/16
func GetUint16(source map[interface{}]interface{}, key interface{}, defaultVal uint16) uint16 {
	var result uint16
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetUint32 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:02 下午 2021/11/16
func GetUint32(source map[interface{}]interface{}, key interface{}, defaultVal uint32) uint32 {
	var result uint32
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetUint64 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:03 下午 2021/11/16
func GetUint64(source map[interface{}]interface{}, key interface{}, defaultVal uint64) uint64 {
	var result uint64
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetFloat32 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:03 下午 2021/11/16
func GetFloat32(source map[interface{}]interface{}, key interface{}, defaultVal float32) float32 {
	var result float32
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetFloat64 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:04 下午 2021/11/16
func GetFloat64(source map[interface{}]interface{}, key interface{}, defaultVal float64) float64 {
	var result float64
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetString ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 5:07 下午 2021/11/16
func GetString(source map[interface{}]interface{}, key interface{}, defaultVal string) string {
	var result string
	if err := GetDataWithReceiver(source, key, &result); nil != err {
		return defaultVal
	}
	return result
}

// GetDataWithReceiver 使用制定的数据指针接受结果
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 4:54 下午 2021/11/16
func GetDataWithReceiver(source map[interface{}]interface{}, key interface{}, receiver interface{}) error {
	if !Exist(source, key) {
		return errors.New("key is not found")
	}
	return convert.ConvertAssign(receiver, source[key])
}