diff options
Diffstat (limited to 'internal/dependency.go')
| -rw-r--r-- | internal/dependency.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/internal/dependency.go b/internal/dependency.go new file mode 100644 index 0000000..020b4f5 --- /dev/null +++ b/internal/dependency.go @@ -0,0 +1,51 @@ +package internal + +import ( + "context" + "fmt" +) + +type dependency struct { + okMap map[string]chan struct{} + nokMap map[string]chan struct{} +} + +func newDependency(config config) dependency { + d := dependency{ + okMap: make(map[string]chan struct{}, len(config.Checks)), + nokMap: make(map[string]chan struct{}, len(config.Checks)), + } + + for name := range config.Checks { + d.okMap[name] = make(chan struct{}) + d.nokMap[name] = make(chan struct{}) + } + + return d +} + +func (d dependency) ok(name string) { + close(d.okMap[name]) +} + +func (d dependency) notOk(name string) { + close(d.nokMap[name]) +} + +// Wait for all dependant checks to be executed! +func (d dependency) wait(ctx context.Context, dependencies []string) error { + for _, dep := range dependencies { + if _, ok := d.okMap[dep]; !ok { + // We sent an error mail already via config.sanityCheck for this case. + continue + } + select { + case <-d.okMap[dep]: + case <-d.nokMap[dep]: + return fmt.Errorf("dependency '%s' is not OK!", dep) + case <-ctx.Done(): + return fmt.Errorf("waited for too long for dependency '%s': %s", dep, ctx.Err().Error()) + } + } + return nil +} |
