package script import ( "log" "strconv" "strings" ) type Condition struct { Scope string `json:"scope"` Key string `json:"key"` Op string `json:"op"` Value string `json:"value,omitempty"` Not bool `json:"not,omitempty"` } func (c *Condition) Check(set VariableSet, match string, devices []string) bool { var value string switch c.Scope { case "global": value = set.Global(c.Key) case "match": value = set.Match(match, c.Key) case "devices": value = set.Devices(devices, c.Key) default: return c.Not } valueInt, valueIntErr := strconv.ParseInt(value, 10, 64) targetInt, _ := strconv.ParseInt(c.Value, 10, 64) switch c.Op { case "eq": return !c.Not == (value == c.Value) case "neq": return !c.Not == (value != c.Value) case "gt": return !c.Not == (valueInt > targetInt) case "lt": return !c.Not == (valueInt < targetInt) case "gte": log.Println(c.Not, valueInt, targetInt) return !c.Not == (valueInt >= targetInt) case "lte": return !c.Not == (valueInt <= targetInt) case "exists": return !c.Not == (value != "") case "contains": return !c.Not == strings.Contains(value, c.Value) case "numerical": return !c.Not == (valueIntErr == nil) default: return c.Not } }