-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresult.go
139 lines (116 loc) · 3.31 KB
/
result.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* nagopher - Library for writing Nagios plugins in Go
* Copyright (C) 2018-2019 Pascal Mathis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package nagopher
import (
"fmt"
)
// Result represents the output of a context, after the evaluation of an associated metric
type Result interface {
fmt.Stringer
Hint() string
State() OptionalState
Metric() OptionalMetric
Context() OptionalContext
Resource() OptionalResource
}
// ResultOpt is a type alias for functional options used by NewResult()
type ResultOpt func(*result)
type result struct {
hint string
state OptionalState
metric OptionalMetric
context OptionalContext
resource OptionalResource
}
// NewResult instantiates a new Result with the given functional options
func NewResult(options ...ResultOpt) Result {
result := &result{}
for _, option := range options {
option(result)
}
return result
}
// ResultHint is a functional option for NewResult(), which stores the hint of the result
func ResultHint(value string) ResultOpt {
return func(r *result) {
r.hint = value
}
}
// ResultState is a functional option for NewResult(), which stores the state of the result
func ResultState(value State) ResultOpt {
return func(r *result) {
if value != nil {
r.state = NewOptionalState(value)
}
}
}
// ResultMetric is a functional option for NewResult(), which stores the responsible metric of the result
func ResultMetric(value Metric) ResultOpt {
return func(r *result) {
if value != nil {
r.metric = NewOptionalMetric(value)
}
}
}
// ResultContext is a functional option for NewResult(), which stores the responsible context of the result
func ResultContext(value Context) ResultOpt {
return func(r *result) {
if value != nil {
r.context = NewOptionalContext(value)
}
}
}
// ResultResource is a functional option for NewResult(), which stores the responsible resource of the result
func ResultResource(value Resource) ResultOpt {
return func(r *result) {
if value != nil {
r.resource = NewOptionalResource(value)
}
}
}
func (r result) String() string {
var description string
if metric, err := r.metric.Get(); err == nil {
if context, err := r.context.Get(); err == nil {
description = context.Describe(metric)
} else {
description = metric.ToNagiosValue()
}
}
if r.hint != "" && description != "" {
return fmt.Sprintf("%s (%s)", description, r.hint)
} else if r.hint != "" {
return r.hint
}
return description
}
func (r result) Hint() string {
return r.hint
}
func (r result) State() OptionalState {
return r.state
}
func (r result) Metric() OptionalMetric {
return r.metric
}
func (r result) Context() OptionalContext {
return r.context
}
func (r result) Resource() OptionalResource {
return r.resource
}