-
Notifications
You must be signed in to change notification settings - Fork 3
/
option.go
87 lines (73 loc) · 1.85 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
package base64Kit
import "encoding/base64"
type (
base64Options struct {
encoding *base64.Encoding
padding *rune
}
Base64Option func(opts *base64Options)
)
// Encode
/*
参考: base64.Encoding.EncodeToString()
*/
func (opts *base64Options) Encode(src []byte) []byte {
enc := opts.encoding
buf := make([]byte, enc.EncodedLen(len(src)))
enc.Encode(buf, src)
return buf
}
// Decode
/*
参考: base64.Encoding.DecodeString()
*/
func (opts *base64Options) Decode(src []byte) ([]byte, error) {
enc := opts.encoding
dbuf := make([]byte, enc.DecodedLen(len(src)))
n, err := enc.Decode(dbuf, src)
return dbuf[:n], err
}
func (opts *base64Options) EncodeToString(src []byte) string {
return opts.encoding.EncodeToString(src)
}
func (opts *base64Options) DecodeString(s string) ([]byte, error) {
return opts.encoding.DecodeString(s)
}
func loadOptions(options ...Base64Option) *base64Options {
opts := &base64Options{
encoding: nil,
padding: nil,
}
for _, option := range options {
option(opts)
}
if opts.encoding == nil {
// 默认值
opts.encoding = base64.StdEncoding
}
if opts.padding != nil {
// Encoding.WithPadding 返回的是一个新的 *Encoding 实例(并不会修改原先的)
opts.encoding = opts.encoding.WithPadding(*opts.padding)
}
return opts
}
// WithEncoding 默认: base64.StdEncoding.
/*
@param encoding base64.StdEncoding || base64.URLEncoding || base64.RawStdEncoding || base64.RawURLEncoding
*/
func WithEncoding(encoding *base64.Encoding) Base64Option {
return func(opts *base64Options) {
opts.encoding = encoding
}
}
// WithPadding
/*
PS:
(1) base64.StdEncoding 和 base64.URLEncoding 的padding: '='(61)
(2) base64.RawStdEncoding 和 base64.RawURLEncoding 的padding: -1(base64.NoPadding)
*/
func WithPadding(padding *rune) Base64Option {
return func(opts *base64Options) {
opts.padding = padding
}
}