mtfosbot/module/utils/utils.go

172 lines
3.0 KiB
Go
Raw Permalink Normal View History

2018-08-22 08:57:02 +00:00
package utils
import (
2018-09-21 13:37:33 +00:00
"math"
2018-08-22 08:57:02 +00:00
"os"
"path"
"reflect"
"regexp"
"runtime"
"strings"
)
2018-09-21 13:37:33 +00:00
// PageObject -
type PageObject struct {
Page int `json:"page" cc:"page"`
Total int `json:"total" cc:"total"`
Offset int `json:"offset" cc:"offset"`
Limit int `json:"limit" cc:"limit"`
}
// CalcPage -
func CalcPage(count, page, max int) (po PageObject) {
if count < 0 {
count = 0
}
if page < 1 {
page = 1
}
if max < 1 {
max = 1
}
total := int(math.Ceil(float64(count) / float64(max)))
if total < 1 {
total = 1
}
if page > total {
page = total
}
offset := (page - 1) * max
if offset > count {
offset = count
}
limit := max
po = PageObject{}
po.Limit = limit
po.Page = page
po.Offset = offset
po.Total = total
return
}
2018-08-22 08:57:02 +00:00
// ToMap struct to map[string]interface{}
func ToMap(ss interface{}) map[string]interface{} {
t := reflect.ValueOf(ss)
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
smap := make(map[string]interface{})
mtag := regexp.MustCompile(`cc:\"(.+)\"`)
2018-12-19 03:34:01 +00:00
re := regexp.MustCompile(`^[A-Z]`)
2018-08-22 08:57:02 +00:00
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
tag := string(t.Type().Field(i).Tag)
str := mtag.FindStringSubmatch(tag)
name := t.Type().Field(i).Name
2018-12-19 03:34:01 +00:00
if !re.Match([]byte(name)) {
continue
}
2018-12-13 06:13:32 +00:00
leveling := false
2018-08-22 08:57:02 +00:00
if len(str) > 1 {
2018-12-13 06:13:32 +00:00
strArr := strings.Split(str[1], ",")
name = strArr[0]
if len(strArr) > 1 && strArr[1] == "<<" {
leveling = true
}
2018-08-22 08:57:02 +00:00
}
2018-12-13 06:13:32 +00:00
if f.Kind() == reflect.Slice {
if name == "-" {
continue
}
if f.Len() > 0 && f.Index(0).Kind() != reflect.Struct {
smap[name] = f.Interface()
continue
}
tmp := make([]map[string]interface{}, f.Len())
for i := 0; i < f.Len(); i++ {
tmp[i] = ToMap(f.Index(i).Interface())
}
smap[name] = tmp
continue
}
if f.Kind() == reflect.Struct {
if name == "-" && leveling == false {
continue
}
if leveling == true {
2018-12-13 07:30:36 +00:00
tmp := ToMap(f.Interface())
2018-12-13 06:13:32 +00:00
for k, v := range tmp {
smap[k] = v
}
} else if name != "-" && leveling == false {
2018-12-13 07:30:36 +00:00
smap[name] = f.Interface()
2018-12-13 06:13:32 +00:00
}
continue
}
2018-08-22 08:57:02 +00:00
if name != "-" {
smap[name] = f.Interface()
}
}
return smap
}
// ParsePath - parse file path to absPath
func ParsePath(dst string) string {
wd, err := os.Getwd()
if err != nil {
wd = ""
}
if []rune(dst)[0] == '~' {
home := UserHomeDir()
if len(home) > 0 {
dst = strings.Replace(dst, "~", home, -1)
}
}
if path.IsAbs(dst) {
dst = path.Clean(dst)
return dst
}
str := path.Join(wd, dst)
str = path.Clean(str)
return str
}
// UserHomeDir - get user home directory
func UserHomeDir() string {
env := "HOME"
if runtime.GOOS == "windows" {
env = "USERPROFILE"
} else if runtime.GOOS == "plan9" {
env = "home"
}
return os.Getenv(env)
}
// CheckExists - check file exists
func CheckExists(filePath string, allowDir bool) bool {
filePath = ParsePath(filePath)
stat, err := os.Stat(filePath)
if err != nil && !os.IsExist(err) {
return false
}
if !allowDir && stat.IsDir() {
return false
}
return true
}