package form import ( "bytes" "encoding/json" "html" "io" "io/ioutil" "net/http" "regexp" "strconv" "strings" "time" ) type readCloser struct { io.Reader } func (rc readCloser) Close() error { return nil } func GetAll(r *http.Request, k string) []string { r.ParseForm() v, _ := r.Form[k] return v } func Get(r *http.Request, k string) string { s := r.FormValue(k) if s == "" { b, _ := ioutil.ReadAll(r.Body) var m map[string]json.RawMessage if err := json.Unmarshal(b, &m); err != nil { return "" } v, _ := m[k] s = strings.TrimPrefix(strings.TrimSuffix(string(v), `"`), `"`) r.Body = readCloser{bytes.NewReader(b)} } s = html.UnescapeString(s) s = strings.ReplaceAll(s, "\r", "") return s } func ToInt(s string) int { v, _ := strconv.Atoi(s) return v } func ToStrArr(k string) []string { arr := strings.Split(k, ",") outArr := []string{} for i := range arr { s := strings.TrimSpace(arr[i]) if len(s) > 0 { outArr = append(outArr, s) } } return outArr } func ToDuration(s string) time.Duration { var d time.Duration for _, c := range []struct { key string d time.Duration }{ {"d", time.Hour * 24}, {"w", time.Hour * 24 * 7}, } { daysPattern := regexp.MustCompile(`(^|[a-z])[0-9]+` + c.key + `($|[0-9])`) idxes := daysPattern.FindAllStringIndex(s, -1) if len(idxes) > 1 { return 0 } for _, idx := range idxes { substr := s[idx[0]:idx[1]] for len(substr) > 0 && (substr[0] < '0' || substr[0] > '9') { substr = substr[1:] } for len(substr) > 0 && (substr[len(substr)-1] >= '0' && substr[len(substr)-1] <= '9') { substr = substr[:len(substr)-1] } s = strings.ReplaceAll(s, substr, "") substr = strings.TrimSuffix(substr, c.key) n, _ := strconv.Atoi(substr) d += c.d * time.Duration(n) } } d2, _ := time.ParseDuration(s) return d2 + d } func ToTime(s string) time.Time { v, err := time.Parse("2006-01-02 15:04:05", s) if err != nil || v.IsZero() { v, err = time.Parse("2006-01-02", s) } if err != nil || v.IsZero() { v, err = time.Parse("1/2/06", s) } if err != nil || v.IsZero() { v, err = time.Parse("02 Jan 2006 3:04 PM", s) } if err != nil || v.IsZero() { v, err = time.Parse("02 Jan 2006 3:04 PM", strings.ReplaceAll(s, "+", " ")) } return v }