/
checkpending.go
99 lines (86 loc) · 2.16 KB
/
checkpending.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
package keycloakb
import (
"encoding/json"
"errors"
"time"
)
// PendingChecks interface
type PendingChecks interface {
AddPendingCheck(nature string)
RemovePendingCheck(nature string)
ToAttribute() *string
ToCheckNames() *[]string
}
type pendingChecks struct {
checks map[string]int64
}
// Exportable values
var (
ErrCantUnmarshalPendingCheck = errors.New("can't unmarshal pending check value")
)
// AddPendingCheck adds a pending check
func AddPendingCheck(value *string, nature string) (*string, error) {
var pc, err = NewPendingChecks(value)
if err != nil && err != ErrCantUnmarshalPendingCheck {
return nil, err
}
pc.AddPendingCheck(nature)
return pc.ToAttribute(), err
}
// RemovePendingCheck removes a pending check
func RemovePendingCheck(value *string, nature string) (*string, error) {
var pc, err = NewPendingChecks(value)
if err != nil && err != ErrCantUnmarshalPendingCheck {
return nil, err
}
pc.RemovePendingCheck(nature)
return pc.ToAttribute(), err
}
// GetPendingChecks get pending checks
func GetPendingChecks(value *string) *[]string {
var pc, err = NewPendingChecks(value)
if err != nil && err != ErrCantUnmarshalPendingCheck {
return nil
}
return pc.ToCheckNames()
}
// NewPendingChecks creates a PendingChecks value
func NewPendingChecks(value *string) (PendingChecks, error) {
var checks map[string]int64
var err error
if value != nil {
if errUnmarshal := json.Unmarshal([]byte(*value), &checks); errUnmarshal != nil {
err = ErrCantUnmarshalPendingCheck
}
}
if checks == nil {
checks = map[string]int64{}
}
return &pendingChecks{
checks: checks,
}, err
}
func (pc *pendingChecks) AddPendingCheck(nature string) {
pc.checks[nature] = time.Now().UnixNano() / 1000000
}
func (pc *pendingChecks) RemovePendingCheck(nature string) {
delete(pc.checks, nature)
}
func (pc *pendingChecks) ToAttribute() *string {
if len(pc.checks) == 0 {
return nil
}
var bytes, _ = json.Marshal(pc.checks)
var attribute = string(bytes)
return &attribute
}
func (pc *pendingChecks) ToCheckNames() *[]string {
var res []string
for check := range pc.checks {
res = append(res, check)
}
if len(res) == 0 {
return nil
}
return &res
}