forked from Murray-LIANG/gounity
/
option.go
139 lines (116 loc) · 3.59 KB
/
option.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
package gounity
import (
"github.com/sirupsen/logrus"
)
// Options defines the mapping of optional parameters.
type Options map[string]interface{}
// Option defines an optional parameter.
type Option func(*Options)
// NewOptions constructs the optional parameters.
func NewOptions(opts ...Option) *Options {
res := &Options{}
for _, opt := range opts {
opt(res)
}
return res
}
// WarnNotUsedOptions logs warning messages for not-used optional parameters.
func (o *Options) WarnNotUsedOptions() {
for input, value := range *o {
logrus.Warnf("argument (%s:%v) ignored", input, value)
}
}
func (o *Options) push(key string, value interface{}) {
logrus.Debugf("argument (%s:%v) input", key, value)
(*o)[key] = value
}
func (o *Options) pop(key string) interface{} {
if res, ok := (*o)[key]; ok {
logrus.Debugf("argument (%s:%v) used", key, res)
delete(*o, key)
return res
}
return nil
}
// PushName adds optional parameter `name`.
func (o *Options) PushName(name string) {
o.push("name", name)
}
// PopName retrieves optional parameter `name` and removes it from options.
func (o *Options) PopName() interface{} {
return o.pop("name")
}
// NameOpt constructs optional parameter `name`.
func NameOpt(name string) Option {
return func(o *Options) {
o.PushName(name)
}
}
// PushSize adds optional parameter `size`.
func (o *Options) PushSize(sizeBytes uint64) {
o.push("size", sizeBytes)
}
// PopSize retrieves optional parameter `size` and removes it from options.
func (o *Options) PopSize() interface{} {
return o.pop("size")
}
// SizeGBOpt constructs optional parameter `size` in GB.
func SizeGBOpt(sizeGB uint64) Option {
return func(o *Options) {
o.PushSize(gbToBytes(sizeGB))
}
}
// PushHostAccess adds optional parameter `hostAccess`.
func (o *Options) PushHostAccess(host *Host, accessMask HostLUNAccessEnum) {
allHostAccess := []interface{}{}
existing := o.pop("hostAccess")
if existing != nil {
allHostAccess = existing.([]interface{})
}
allHostAccess = append(
allHostAccess,
map[string]interface{}{
"host": host.Repr(),
"accessMask": accessMask,
},
)
o.push("hostAccess", allHostAccess)
}
// PopHostAccess retrieves optional parameter `hostAccess` and removes it from options.
func (o *Options) PopHostAccess() interface{} {
return o.pop("hostAccess")
}
// HostAccessOpt constructs optional parameter `hostAccess`.
func HostAccessOpt(host *Host, accessMask HostLUNAccessEnum) Option {
return func(o *Options) {
o.PushHostAccess(host, accessMask)
}
}
// PushDefaultAccess adds optional parameter `defaultAccess`.
func (o *Options) PushDefaultAccess(da NFSShareDefaultAccessEnum) {
o.push("defaultAccess", da)
}
// PopDefaultAccess retrieves optional parameter `defaultAccess` and removes it from options.
func (o *Options) PopDefaultAccess() interface{} {
return o.pop("defaultAccess")
}
// DefaultAccessOpt constructs optional parameter `defaultAccess`.
func DefaultAccessOpt(da NFSShareDefaultAccessEnum) Option {
return func(o *Options) {
o.PushDefaultAccess(da)
}
}
// PushSupportedProtocols adds optional parameter `supportedProtocols`.
func (o *Options) PushSupportedProtocols(protocol FSSupportedProtocolEnum) {
o.push("supportedProtocols", protocol)
}
// PopSupportedProtocols retrieves optional parameter `supportedProtocols` and removes it from options.
func (o *Options) PopSupportedProtocols() interface{} {
return o.pop("supportedProtocols")
}
// SupportedProtocolsOpt constructs optional parameter `supportedProtocols`.
func SupportedProtocolsOpt(protocol FSSupportedProtocolEnum) Option {
return func(o *Options) {
o.PushSupportedProtocols(protocol)
}
}