package tools
import (
"bytes"
"crypto/md5"
"encoding/base64"
"encoding/binary"
"encoding/hex"
"fmt"
"math"
"os"
"strconv"
"strings"
"unicode"
"github.com/gofrs/uuid"
"github.com/saintfish/chardet"
)
func GetMd5String(s string) string {
h := md5.New()
h.Write([]byte(s))
return hex.EncodeToString(h.Sum(nil))
}
func GetUUIDString() string {
uuid := uuid.Must(uuid.NewV4())
return uuid.String()
}
func RemoteAddr2IPAddr(key string) string {
str := strings.Split(key, ":")
return str[0]
}
func CreateFolderAndFile(folder, filename string) (*os.File, error) {
temp_last := folder[len(folder)-1:]
if temp_last != "/" {
folder = folder + "/"
}
if folder != "" {
os.MkdirAll(folder, os.ModePerm)
}
newfile := folder + filename
file, err := os.OpenFile(newfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
return file, err
}
func Typeof(v interface{}) string {
return fmt.Sprintf("%T", v)
}
func ValidUTF8(filename string) bool {
rawBytes, readfile_err := os.ReadFile(filename)
if readfile_err != nil {
return false
}
detector := chardet.NewTextDetector()
charset, detectbest_err := detector.DetectBest(rawBytes)
if detectbest_err != nil {
return false
}
if charset.Charset == "UTF-8" {
return true
} else {
return false
}
}
func JoinString(args ...string) string {
var args_buffer bytes.Buffer
for i := 0; i < len(args); i++ {
args_buffer.WriteString(args[i])
}
return args_buffer.String()
}
func RoundedFixed(val float64, n int) float64 {
change := math.Pow(10, float64(n))
fv := 0.0000000001 + val
return math.Floor(fv*change+.5) / change
}
func CompareNCS(str1 string, str2 string) bool {
return strings.EqualFold(str1, str2)
}
func Ucfirst(str string) string {
for i, v := range str {
return JoinString(string(unicode.ToUpper(v)), str[i+1:])
}
return str
}
func Lcfirst(str string) string {
for i, v := range str {
return JoinString(string(unicode.ToLower(v)), str[i+1:])
}
return str
}
func StringSliceJoinToString(args []string) string {
var args_buffer bytes.Buffer
for i := 0; i < len(args); i++ {
args_buffer.WriteString(args[i])
}
return args_buffer.String()
}
func ErrorSliceJoinToString(args []error) string {
var args_buffer bytes.Buffer
for i := 0; i < len(args); i++ {
args_buffer.WriteString(args[i].Error())
}
return args_buffer.String()
}
func Base64Encode(input []byte, mode string) string {
if mode == "url" {
return base64.URLEncoding.EncodeToString(input)
}
return base64.StdEncoding.EncodeToString(input)
}
func Base64Decode(input string, mode string) []byte {
if mode == "url" {
uDec, err := base64.URLEncoding.DecodeString(input)
if err != nil {
return []byte("")
}
return uDec
}
uDec, err := base64.StdEncoding.DecodeString(input)
if err != nil {
return []byte("")
}
return uDec
}
func IsBase64(s string) bool {
_, err := base64.StdEncoding.DecodeString(s)
return err == nil
}
func DoubleNumberStringSubToString(sub1 string, sub2 string) string {
num1, err1 := strconv.Atoi(sub1)
if err1 != nil {
return ""
}
num2, err2 := strconv.Atoi(sub2)
if err2 != nil {
return ""
}
num3 := num1 - num2
return strconv.Itoa(num3)
}
func IntToBytes(n int) []byte {
data := int64(n)
bytebuf := bytes.NewBuffer([]byte{})
binary.Write(bytebuf, binary.BigEndian, data)
return bytebuf.Bytes()
}
func BytesToInt(bys []byte) int {
bytebuff := bytes.NewBuffer(bys)
var data int64
binary.Read(bytebuff, binary.BigEndian, &data)
return int(data)
}