diff --git a/config.go b/config.go index 8c7b1df..1159a09 100644 --- a/config.go +++ b/config.go @@ -34,6 +34,12 @@ type Config struct { ai AI } +var ( + renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]` + renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]` + renderEventNamePattern = `(\[[^\]]*\] *)?(?P.*)` +) + func newConfig(ctx context.Context) (Config, error) { return newConfigFromEnv(ctx, os.Getenv) } @@ -42,9 +48,9 @@ func newConfigFromEnv(ctx context.Context, getEnv func(string) string) (Config, def := Config{ Port: 38080, OllamaModel: "gemma:2b", - AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`, - DatacenterPattern: `[a-z]{4}[a-z]*-[0-9]`, - EventNamePattern: `(^\[[^\]]*\] *)?(?P.*)`, + AssetPattern: renderAssetPattern, + DatacenterPattern: renderDatacenterPattern, + EventNamePattern: renderEventNamePattern, } var m map[string]any diff --git a/main_test.go b/main_test.go index 9d3c67f..72e926c 100644 --- a/main_test.go +++ b/main_test.go @@ -39,6 +39,9 @@ func TestRun(t *testing.T) { u := fmt.Sprintf("http://localhost:%d", port) cfg := Config{} + cfg.DatacenterPattern = renderDatacenterPattern + cfg.AssetPattern = renderAssetPattern + cfg.EventNamePattern = renderEventNamePattern cfg.Port = port cfg.driver = NewRAM() cfg.storage = NewStorage(cfg.driver) @@ -120,7 +123,7 @@ func TestRun(t *testing.T) { } if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { t.Fatal(err) - } else if result.EventNames[0] != "[Oregon-1] Wal Receive Count Alert" { + } else if result.EventNames[0] != "Wal Receive Count Alert" { t.Fatal(result.EventNames) } else { t.Logf("%+v", result) @@ -215,14 +218,17 @@ func TestRun(t *testing.T) { t.Fatalf("(%d) %s", resp.StatusCode, b) } - dec := csv.NewReader(resp.Body) + b, _ := io.ReadAll(resp.Body) + t.Logf("whole csv: \n%s", b) + + dec := csv.NewReader(bytes.NewReader(b)) var lastLine []string for { line, err := dec.Read() if err == io.EOF { break } else if err != nil { - t.Error(err) + t.Error("unexpected error while reading csv line:", err) } if lastLine == nil { @@ -230,7 +236,7 @@ func TestRun(t *testing.T) { t.Errorf("last line had %v elements but this line has %v", len(lastLine), len(line)) } - t.Logf("%+v", line) + t.Logf("CSV line: %+v", line) lastLine = line } if lastLine == nil { diff --git a/message.go b/message.go index 4433925..627dd04 100644 --- a/message.go +++ b/message.go @@ -113,13 +113,20 @@ func ParseSlack(b []byte, assetPattern, datacenterPattern, eventNamePattern stri return Message{}, err } - asset := regexp.MustCompile(assetPattern) - datacenter := regexp.MustCompile(datacenterPattern) - eventName := regexp.MustCompile(eventNamePattern) - - m.Asset = asset.FindString(m.Asset) - m.Datacenter = datacenter.FindString(m.Datacenter) - m.EventName = eventName.FindString(m.EventName) + for pattern, ptr := range map[string]*string{ + assetPattern: &m.Asset, + datacenterPattern: &m.Datacenter, + eventNamePattern: &m.EventName, + } { + r := regexp.MustCompile(pattern) + parsed := r.FindString(*ptr) + for i, name := range r.SubexpNames() { + if i > 0 && name != "" { + parsed = r.FindStringSubmatch(*ptr)[i] + } + } + *ptr = parsed + } return m, nil } diff --git a/message_test.go b/message_test.go index 2f421ab..44ed012 100644 --- a/message_test.go +++ b/message_test.go @@ -7,12 +7,6 @@ import ( "testing" ) -var ( - renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]` - renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]` - renderEventNamePattern = `(^\[[^\]]*\] *)?(?P.*)` -) - func TestParseSlackTestdata(t *testing.T) { cases := map[string]struct { slackMessage slackMessage @@ -130,8 +124,8 @@ func TestParseSlackTestdata(t *testing.T) { t.Fatal(err) } - t.Run("parseSlackJSON", func(t *testing.T) { - got, err := parseSlackJSON(b) + t.Run("_parseSlackJSON", func(t *testing.T) { + got, err := _parseSlackJSON(b) if err != nil { t.Fatal(err) }