12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package identify
- import (
- "encoding/json"
- )
- type MultiItem struct {
- nvs map[ItemName]ItemValue // 当前值
- ovs map[ItemName]ItemValue // 上一次的值
- rules map[EventName]MultiRule
- }
- func (m *MultiItem) Check(ovs, nvs map[ItemName]ItemValue) EventName {
- m.ovs = ovs
- m.nvs = nvs
- defer func() {
- m.ovs = nil
- m.nvs = nil
- }()
- for eventName, multiRule := range m.rules {
- if m.check(multiRule) {
- return eventName
- }
- }
- return ""
- }
- func (m *MultiItem) check(rules MultiRule) bool {
- s := newSingleCheckForMultiItem()
- s.SetVars(m.nvs)
- // 判断指定的点位名, 是否通过了检测, 有一项不为true, 提前返回false
- for itemName, rule := range rules {
- if s.checkForMulti(m.ovs[itemName], m.nvs[itemName], rule) == false {
- return false
- }
- }
- return true
- }
- func NewMultiCheck(rules map[EventName]MultiRule) *MultiItem {
- return &MultiItem{
- rules: rules,
- }
- }
- func MultiTest(ovs, nvs map[ItemName]ItemValue, ruleString string) string {
- rules := make(map[EventName]MultiRule)
- err := json.Unmarshal([]byte(ruleString), &rules)
- if err != nil {
- println(err.Error())
- }
- return NewMultiCheck(rules).Check(ovs, nvs)
- }
|