package main import ( "bytes" "fmt" "riedstra.dev/go/checkup" ) type httpCheck struct { URL string Code int } func httpStatusWorker(jobs <-chan httpCheck, msg chan<- *string) { for hc := range jobs { err := checkup.HttpStatusOK(hc.URL, hc.Code) if err != nil { s := fmt.Sprintf("Checking: %s, %v\n", hc.URL, err) msg <- &s continue } msg <- nil } } func checkStatus(conf *Config) { buf := &bytes.Buffer{} hc := make(chan httpCheck) msgs := make(chan *string) for i := 1; i <= conf.Workers; i++ { go httpStatusWorker(hc, msgs) } go func() { for url, code := range conf.StatusChecks { if code == nil { code = &conf.ExpectedStatusCode } hc <- httpCheck{url, *code} } close(hc) }() for i := 0; i < len(conf.StatusChecks); i++ { m := <-msgs if m != nil { buf.Write([]byte(*m)) } } notify(conf, buf.Bytes()) }