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  }