forked from xalanq/cf-tool
/
util.go
142 lines (128 loc) · 2.8 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package util
import (
"bufio"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math/rand"
"net/http"
"net/url"
"os"
"strconv"
"strings"
"github.com/fatih/color"
)
// CHA map
const CHA = "abcdefghijklmnopqrstuvwxyz0123456789"
// RandString n is the length. a-z 0-9
func RandString(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = CHA[rand.Intn(len(CHA))]
}
return string(b)
}
// Scanline scan line
func Scanline() string {
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
return scanner.Text()
}
fmt.Println("\nInterrupted.")
os.Exit(1)
return ""
}
// ScanlineTrim scan line and trim
func ScanlineTrim() string {
return strings.TrimSpace(Scanline())
}
// ChooseIndex return valid index in [0, maxLen)
func ChooseIndex(maxLen int) int {
color.Cyan("Please choose one (index): ")
for {
index := ScanlineTrim()
i, err := strconv.Atoi(index)
if err == nil && i >= 0 && i < maxLen {
return i
}
color.Red("Invalid index! Please try again: ")
}
}
// YesOrNo must choose one
func YesOrNo(note string) bool {
color.Cyan(note)
for {
tmp := ScanlineTrim()
if tmp == "y" || tmp == "Y" {
return true
}
if tmp == "n" || tmp == "N" {
return false
}
color.Red("Invalid input. Please input again: ")
}
}
// GetBody read body
func GetBody(client *http.Client, URL string) ([]byte, error) {
resp, err := client.Get(URL)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
// PostBody read post body
func PostBody(client *http.Client, URL string, data url.Values) ([]byte, error) {
resp, err := client.PostForm(URL, data)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
// GetJSONBody read json body
func GetJSONBody(client *http.Client, url string) (map[string]interface{}, error) {
resp, err := client.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
decoder := json.NewDecoder(resp.Body)
var data map[string]interface{}
if err = decoder.Decode(&data); err != nil {
return nil, err
}
return data, nil
}
// DebugSave write data to temperory file
func DebugSave(data interface{}) {
f, err := os.OpenFile("./tmp/body", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
if data, ok := data.([]byte); ok {
if _, err := f.Write(data); err != nil {
log.Fatal(err)
}
} else {
if _, err := f.Write([]byte(fmt.Sprintf("%v\n\n", data))); err != nil {
log.Fatal(err)
}
}
if err := f.Close(); err != nil {
log.Fatal(err)
}
}
// DebugJSON debug
func DebugJSON(data interface{}) {
text, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(text))
}
// IsURL returns true if a given string is an url
func IsURL(str string) bool {
if _, err := url.ParseRequestURI(str); err == nil {
return true
}
return false
}