55 lines
943 B
Go
Raw Normal View History

2018-06-03 20:04:11 +02:00
// Package diag implements network diagnostics.
package diag
import "fmt"
type Node interface {
Then(t Node) Node
Children() []Node
Evaluate() (status string, _ error)
}
type Monitor struct {
root Node
}
func NewMonitor(n Node) *Monitor {
return &Monitor{root: n}
}
type EvalResult struct {
Name string
Error bool
Status string
Children []*EvalResult
}
func evaluate(n Node, err string) *EvalResult {
r := EvalResult{
Name: fmt.Sprintf("%s", n),
Status: err,
Error: err != "",
}
if r.Status == "" {
status, err := n.Evaluate()
if err != nil {
r.Error = true
r.Status = err.Error()
} else {
r.Status = status
}
}
var childErr string
if r.Error {
childErr = fmt.Sprintf("dependency %s failed", r.Name)
}
for _, n := range n.Children() {
r.Children = append(r.Children, evaluate(n, childErr))
}
return &r
}
func (m *Monitor) Evaluate() *EvalResult {
return evaluate(m.root, "")
}