Openstatus
www.openstatus.dev
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 Key request.Record `json:"key"`
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}