@@ -13,40 +13,41 @@ func Empty[T Auditable]() T {
13
13
return t
14
14
}
15
15
16
- func Diff [T Auditable ](old , new T ) DiffMap {
16
+ // Diff compares two auditable resources and produces a map
17
+ func Diff [T Auditable ](left , right T ) DiffMap {
17
18
// Values are equal, return an empty diff.
18
- if reflect .DeepEqual (old , new ) {
19
+ if reflect .DeepEqual (left , right ) {
19
20
return DiffMap {}
20
21
}
21
22
22
- return diffValues (old , new )
23
+ return diffValues (left , right , AuditableResources )
23
24
}
24
25
25
- func diffValues [T any ](old , new T ) DiffMap {
26
+ func diffValues [T any ](left , right T , table Map ) DiffMap {
26
27
var (
27
28
baseDiff = DiffMap {}
28
29
29
- oldV = reflect .ValueOf (old )
30
+ leftV = reflect .ValueOf (left )
30
31
31
- newV = reflect .ValueOf (new )
32
- newT = reflect .TypeOf (new )
32
+ rightV = reflect .ValueOf (right )
33
+ rightT = reflect .TypeOf (right )
33
34
34
- diffKey = AuditableResources [ newT .Name ()]
35
+ diffKey = table [ rightT .Name ()]
35
36
)
36
37
37
38
if diffKey == nil {
38
- panic (fmt .Sprintf ("dev error: type %T attempted audit but not auditable" , new ))
39
+ panic (fmt .Sprintf ("dev error: type %q (type %T) attempted audit but not auditable" , rightT . Name (), right ))
39
40
}
40
41
41
- for i := 0 ; i < newT .NumField (); i ++ {
42
+ for i := 0 ; i < rightT .NumField (); i ++ {
42
43
var (
43
- oldF = oldV .Field (i )
44
- newF = newV .Field (i )
44
+ leftF = leftV .Field (i )
45
+ rightF = rightV .Field (i )
45
46
46
- oldI = oldF .Interface ()
47
- newI = newF .Interface ()
47
+ leftI = leftF .Interface ()
48
+ rightI = rightF .Interface ()
48
49
49
- diffName = newT .Field (i ).Tag .Get ("json" )
50
+ diffName = rightT .Field (i ).Tag .Get ("json" )
50
51
)
51
52
52
53
atype , ok := diffKey [diffName ]
@@ -60,23 +61,23 @@ func diffValues[T any](old, new T) DiffMap {
60
61
61
62
// If the field is a pointer, dereference it. Nil pointers are coerced
62
63
// to the zero value of their underlying type.
63
- if oldF .Kind () == reflect .Ptr && newF .Kind () == reflect .Ptr {
64
- oldF , newF = derefPointer (oldF ), derefPointer (newF )
65
- oldI , newI = oldF .Interface (), newF .Interface ()
64
+ if leftF .Kind () == reflect .Ptr && rightF .Kind () == reflect .Ptr {
65
+ leftF , rightF = derefPointer (leftF ), derefPointer (rightF )
66
+ leftI , rightI = leftF .Interface (), rightF .Interface ()
66
67
}
67
68
68
69
// Recursively walk up nested structs.
69
- if newF .Kind () == reflect .Struct {
70
- baseDiff [diffName ] = diffValues (oldI , newI )
70
+ if rightF .Kind () == reflect .Struct {
71
+ baseDiff [diffName ] = diffValues (leftI , rightI , table )
71
72
continue
72
73
}
73
74
74
- if ! reflect .DeepEqual (oldI , newI ) {
75
+ if ! reflect .DeepEqual (leftI , rightI ) {
75
76
switch atype {
76
77
case ActionTrack :
77
- baseDiff [diffName ] = newI
78
+ baseDiff [diffName ] = rightI
78
79
case ActionSecret :
79
- baseDiff [diffName ] = reflect .Zero (newF .Type ()).Interface ()
80
+ baseDiff [diffName ] = reflect .Zero (rightF .Type ()).Interface ()
80
81
}
81
82
}
82
83
}
0 commit comments