cvc/src/loreal.com/dit/utils/utils.go

246 lines
5.4 KiB
Go

//Package utils - common functions used in CEH project
package utils
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math/rand"
"net/http"
"os"
"strconv"
"strings"
"time"
)
const letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
var src = rand.NewSource(time.Now().UnixNano())
//RandomString generate random string by length
func RandomString(n int) string {
b := make([]byte, n)
// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return string(b)
}
//RandomNumber 随机数
func RandomNumber(n int) string {
rand.Seed(time.Now().UnixNano())
str := ""
for i := 0; i < n; i++ {
str = str + fmt.Sprint(rand.Intn(10))
}
return str
}
//LoadOrCreateJSON - load JSON file or create new JSON from defaultData
func LoadOrCreateJSON(fileName string, defaultData interface{}) error {
var err error
if err = LoadJSON(fileName, &defaultData); err != nil {
if os.IsNotExist(err) {
err = SaveJSON(defaultData, fileName)
return err
}
log.Println("[Load JSON]", fileName, err)
return err
}
return nil
}
//LoadOrCreateJSONNoEscape - load JSON file or create new JSON from defaultData
func LoadOrCreateJSONNoEscape(fileName string, defaultData interface{}) error {
var err error
if err = LoadJSON(fileName, &defaultData); err != nil {
if os.IsNotExist(err) {
err = SaveJSONNoEscape(defaultData, fileName)
return err
}
log.Println("[Load JSON]", fileName, err)
return err
}
return nil
}
//SaveJSON file
func SaveJSON(data interface{}, fileName string) error {
var err error
var b []byte
var f *os.File
if f, err = os.Create(fileName); err != nil {
return err
}
defer f.Close()
if b, err = json.MarshalIndent(data, "", "\t"); err != nil {
return err
}
if _, err = f.Write(b); err != nil {
return err
}
return nil
}
//SaveJSONNoEscape - save to file without escape
func SaveJSONNoEscape(data interface{}, fileName string) error {
var err error
var f *os.File
if f, err = os.Create(fileName); err != nil {
return err
}
defer f.Close()
if _, err = f.Write(MarshalJSONV2(data, "\t", false)); err != nil {
return err
}
return nil
}
//LoadJSON file
func LoadJSON(fileName string, v interface{}) error {
var err error
var b []byte
var f *os.File
if f, err = os.Open(fileName); err != nil {
return err
}
defer f.Close()
if b, err = ioutil.ReadAll(f); err != nil {
return err
}
return json.Unmarshal(b, &v)
}
//Substr 截取子串,这个对中文无效
func Substr(str string, start int, length int) string {
rs := []rune(str)
rl := len(rs)
end := 0
if start < 0 {
start = rl - 1 + start
}
end = start + length
if start > end {
start, end = end, start
}
if start < 0 {
start = 0
}
if start > rl {
start = rl
}
if end < 0 {
end = 0
}
if end > rl {
end = rl
}
return string(rs[start:end])
}
//OutputJSON - OutputJSON helper
func OutputJSON(w http.ResponseWriter, errCode int, errMsg string, params ...interface{}) {
r := map[string]interface{}{"errcode": errCode, "errmsg": errMsg}
if len(params)%2 == 0 {
for i := 0; i < len(params); i = i + 2 {
if key, ok := params[i].(string); ok {
r[key] = params[i+1]
}
}
}
w.Header().Set("Content-type", "application/json;charset=utf-8")
w.Header().Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate")
b, _ := json.Marshal(r)
w.Write(b)
}
//GetCardKeys - extract keys from cardnumber
func GetCardKeys(cardno string) (storekey, custkey, cardholderkey int) {
if len(cardno) != 22 {
return
}
cardholderno := cardno[16:18]
custno := cardno[8:16]
storeno := cardno[5:8]
cardholderkey, _ = strconv.Atoi(cardholderno)
custkey, _ = strconv.Atoi(custno)
storekey, _ = strconv.Atoi(storeno)
return
}
//MakeFolder - make folder if it is not exist.
func MakeFolder(path string) {
path = NormalizePath(path)
if err := os.MkdirAll(path, os.ModeDir|0770); err != nil {
log.Println("[Mkdir]", err)
}
}
//NormalizePath - Add / at the end of path
func NormalizePath(path string) string {
if !strings.HasSuffix(path, "/") {
return path + "/"
}
return path
}
//NormalizePathPtr - Add / at the end of path
func NormalizePathPtr(path *string) {
if !strings.HasSuffix(*path, "/") {
*path = *path + "/"
}
}
//PrintJSON - print indent json string
func PrintJSON(data interface{}) {
fmt.Println(MarshalJSON(data))
}
//MarshalJSON - marshal indent json string
func MarshalJSON(data interface{}, indent ...bool) string {
if len(indent) > 0 && indent[0] {
b, _ := json.MarshalIndent(data, "", " ")
return string(b)
}
b, _ := json.Marshal(data)
return string(b)
}
//MarshalJSONV2 - Marshal JSON without html Escape
func MarshalJSONV2(t interface{}, indent string, escape bool) []byte {
buffer := &bytes.Buffer{}
encoder := json.NewEncoder(buffer)
if indent != "" {
encoder.SetIndent("", indent)
}
encoder.SetEscapeHTML(escape)
if err := encoder.Encode(t); err != nil {
log.Println("[ERR] - [MarshalJSONNoEscape]:", err)
}
return buffer.Bytes()
}