github.com/stampzilla/stampzilla-go@v2.0.0-rc9+incompatible/nodes/stampzilla-server/models/devices/state.go (about) 1 package devices 2 3 type State map[string]interface{} 4 5 func (ds State) Clone() State { 6 newState := make(State) 7 for k, v := range ds { 8 newState[k] = v 9 } 10 return newState 11 } 12 13 // Bool runs fn only if key is found in map and it is of type bool 14 func (ds State) Bool(key string, fn func(bool)) { 15 if v, ok := ds[key]; ok { 16 if v, ok := v.(bool); ok { 17 fn(v) 18 } 19 } 20 } 21 22 // Int runs fn only if key is found in map and it is of type int 23 func (ds State) Int(key string, fn func(int64)) { 24 if v, ok := ds[key]; ok { 25 if v, ok := v.(int); ok { 26 fn(int64(v)) 27 } 28 if v, ok := v.(int64); ok { 29 fn(v) 30 } 31 } 32 } 33 34 // Float runs fn only if key is found in map and it is of type int 35 func (ds State) Float(key string, fn func(float64)) { 36 if v, ok := ds[key]; ok { 37 if v, ok := v.(float64); ok { 38 fn(v) 39 } 40 } 41 } 42 43 // String runs fn only if key is found in map and it is of type int 44 func (ds State) String(key string, fn func(string)) { 45 if v, ok := ds[key]; ok { 46 if v, ok := v.(string); ok { 47 fn(v) 48 } 49 } 50 } 51 52 // Diff calculates the diff between 2 states. If key is missing in right but exists in left it will not be a diff 53 func (ds State) Diff(right State) State { 54 diff := make(State) 55 for k, v := range ds { 56 rv, ok := right[k] 57 if !ok { 58 //diff[k] = v 59 continue 60 } 61 if ok && v != rv { 62 diff[k] = rv 63 } 64 65 } 66 67 for k, v := range right { 68 if _, ok := ds[k]; !ok { 69 diff[k] = v 70 } 71 } 72 73 return diff 74 } 75 76 // Merge two states 77 func (ds State) Merge(right State) State { 78 diff := make(State) 79 for k, v := range ds { 80 diff[k] = v 81 } 82 for k, v := range right { 83 diff[k] = v 84 } 85 return diff 86 } 87 88 func (ds State) MergeWith(right State) { 89 for k, v := range right { 90 ds[k] = v 91 } 92 }