Openstatus www.openstatus.dev
at 667a3c951c07121fc1fca68fa28bb40ca64fae2d 151 lines 3.5 kB view raw
1package assertions 2 3import ( 4 "encoding/json" 5 "fmt" 6 "slices" 7 "strings" 8 9 "github.com/openstatushq/openstatus/apps/checker/request" 10) 11 12type BodyString struct { 13 AssertionType request.AssertionType `json:"type"` 14 Comparator request.StringComparator `json:"compare"` 15 Target string `json:"target"` 16} 17 18type StatusTarget struct { 19 AssertionType request.AssertionType `json:"type"` 20 Comparator request.NumberComparator `json:"compare"` 21 Target int64 `json:"target"` 22} 23 24type HeaderTarget struct { 25 AssertionType request.AssertionType `json:"type"` 26 Comparator request.StringComparator `json:"compare"` 27 Target string `json:"target"` 28 Key string `json:"key"` 29} 30 31type StringTargetType struct { 32 Comparator request.StringComparator `json:"compare"` 33 Target string `json:"target"` 34} 35 36type RecordTarget struct { 37 Comparator request.RecordComparator `json:"compare"` 38 Target string `json:"target"` 39 Record request.Record `json:"record"` 40} 41 42func (target StringTargetType) StringEvaluate(s string) bool { 43 switch target.Comparator { 44 case request.StringContains: 45 return strings.Contains(s, target.Target) 46 case request.StringNotContains: 47 return !strings.Contains(s, target.Target) 48 case request.StringEmpty: 49 return s == "" 50 case request.StringNotEmpty: 51 return s != "" 52 case request.StringEquals: 53 return s == target.Target 54 case request.StringNotEquals: 55 return s != target.Target 56 case request.StringGreaterThan: 57 return s > target.Target 58 case request.StringGreaterThanEqual: 59 return s >= target.Target 60 case request.StringLowerThan: 61 return s < target.Target 62 case request.StringLowerThanEqual: 63 return s <= target.Target 64 } 65 66 return false 67} 68 69func (target HeaderTarget) HeaderEvaluate(s string) bool { 70 headers := make(map[string]any) 71 72 if err := json.Unmarshal([]byte(s), &headers); err != nil { 73 return false 74 } 75 76 v, found := headers[target.Key] 77 if !found { 78 return false 79 } 80 81 t := StringTargetType{Comparator: target.Comparator, Target: target.Target} 82 // convert all headers to array 83 str := fmt.Sprintf("%v", v) 84 85 return t.StringEvaluate(str) 86} 87 88func (target StatusTarget) StatusEvaluate(value int64) bool { 89 90 switch target.Comparator { 91 case request.NumberEquals: 92 if target.Target != value { 93 return false 94 } 95 case request.NumberNotEquals: 96 if target.Target == value { 97 return false 98 } 99 100 case request.NumberGreaterThan: 101 if target.Target >= value { 102 return false 103 } 104 case request.NumberGreaterThanEqual: 105 if target.Target > value { 106 return false 107 } 108 case request.NumberLowerThan: 109 if target.Target <= value { 110 return false 111 } 112 case request.NumberLowerThanEqual: 113 if target.Target < value { 114 return false 115 } 116 default: 117 fmt.Println("something strange ", target) 118 } 119 return true 120} 121 122func (target RecordTarget) RecordEvaluate(s []string) bool { 123 switch target.Comparator { 124 case request.RecordEquals: 125 if !slices.Contains(s, target.Target) { 126 return false 127 } 128 129 case request.RecordNotEquals: 130 if slices.Contains(s, target.Target) { 131 return false 132 } 133 134 case request.RecordContains: 135 for _, record := range s { 136 if strings.Contains(record, target.Target) { 137 return true 138 } 139 } 140 return false 141 case request.RecordNotContains: 142 for _, record := range s { 143 if strings.Contains(record, target.Target) { 144 return false 145 } 146 } 147 return true 148 } 149 150 return true 151}