/
first.go
125 lines (117 loc) · 2.94 KB
/
first.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
package main
import (
"flag"
"os"
"errors"
"strconv"
"reflect"
"fmt"
)
type S struct{
Configfile string `required:"false" name:"config" default:"/etc/daemon.conf" description:"Конфигурационный файл"`
Auth bool `required:"true" name:"auth" default:"false" description:"Необходиость аутентификации"`
Count int64 `required:"false" name:"count" default:"0" description:"Количество"`
//Duration, float64, int64, Uint, uint64
}
func main() {
s := &S{}
if(len(os.Args) > 1){
err := GetArguments(s)
if err != nil {
fmt.Println(getColor(err.Error(),"r"))
os.Exit(1)
}
// fmt.Printf("%v\n",s)
} else {
fmt.Println("Не переданы нужные аргументы")
}
}
type A struct {
Val string
Type string
Name string
Index int
Req bool
}
func (a *A) String() string{
return a.Val
}
func (a *A) Set(val string) error{
if(len(val) > 0){
a.Val = val
return nil
}
return errors.New("Short string")
}
func GetArguments(s interface{}) error {
val := reflect.TypeOf(s).Elem()
var as []*A
var err error
for i := 0; i < val.NumField(); i++ {
field := val.Field(i)
ft := field.Type.String()
fmt.Println(getColor("Характерстики поля: ","g"),ft ,field.Tag.Get("required"), field.Tag.Get("name"), field.Tag.Get("default"),field.Tag.Get("description"))
var a A
a.Type = ft
a.Index = i
a.Name = field.Tag.Get("name")
a.Req,err = strconv.ParseBool(field.Tag.Get("required"))
if err != nil {return err}
a.Set(field.Tag.Get("default"))
flag.Var(&a, field.Tag.Get("name"), field.Tag.Get("description"))
as = append(as, &a)
}
flag.Parse()
return Pull(s, as)
}
func Pull(s interface{}, as []*A) error{
for _,a := range as {
if !CheckRequireArg(a) { return errors.New("Не передан обязательный аргумент: "+a.Name+"!") }
var v interface{}
var err error
sv := reflect.ValueOf(s).Elem().Field(a.Index)
// fmt.Println("Преобразовываемый тип: ",a.Type)
switch a.Type {
case "string": v = a.Val;
case "bool": v,err = strconv.ParseBool(a.Val)
case "int": v,err = strconv.ParseInt(a.Val,10,0)
case "uint":
var foo uint64
foo,err = strconv.ParseUint(a.Val,10,64)
v = uint(foo)
case "uint64": v,err = strconv.ParseUint(a.Val,10,64)
default: err = errors.New("Низвестный тип " + a.Type + " поля: " + a.Name + "!")
}
if err != nil { return err }
sv.Set(reflect.ValueOf(v))
}
return nil
}
func WhoCame() []*flag.Flag {
var res []*flag.Flag
visit := func(f *flag.Flag) {
res = append(res, f)
}
flag.Visit(visit)
return res
}
func CheckRequireArg(a *A) bool {
if !a.Req {
return true
}
for _,c := range WhoCame() {
if a.Name == c.Name {
return true
}
}
return false
}
func getColor(s,c string) string {
var res string
switch c {
case "g": res += "\x1b[32m"+s+"\x1b[0m"
case "r": res += "\x1b[31m"+s+"\x1b[0m"
default : res = s
}
return res
}