extract named Pattern result if a group is named

main
Bel LaPointe 2024-04-15 05:55:30 -06:00
parent a8270b524c
commit f2a23e5d8a
4 changed files with 35 additions and 22 deletions

View File

@ -34,6 +34,12 @@ type Config struct {
ai AI ai AI
} }
var (
renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]`
renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]`
renderEventNamePattern = `(\[[^\]]*\] *)?(?P<result>.*)`
)
func newConfig(ctx context.Context) (Config, error) { func newConfig(ctx context.Context) (Config, error) {
return newConfigFromEnv(ctx, os.Getenv) return newConfigFromEnv(ctx, os.Getenv)
} }
@ -42,9 +48,9 @@ func newConfigFromEnv(ctx context.Context, getEnv func(string) string) (Config,
def := Config{ def := Config{
Port: 38080, Port: 38080,
OllamaModel: "gemma:2b", OllamaModel: "gemma:2b",
AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`, AssetPattern: renderAssetPattern,
DatacenterPattern: `[a-z]{4}[a-z]*-[0-9]`, DatacenterPattern: renderDatacenterPattern,
EventNamePattern: `(^\[[^\]]*\] *)?(?P<result>.*)`, EventNamePattern: renderEventNamePattern,
} }
var m map[string]any var m map[string]any

View File

@ -39,6 +39,9 @@ func TestRun(t *testing.T) {
u := fmt.Sprintf("http://localhost:%d", port) u := fmt.Sprintf("http://localhost:%d", port)
cfg := Config{} cfg := Config{}
cfg.DatacenterPattern = renderDatacenterPattern
cfg.AssetPattern = renderAssetPattern
cfg.EventNamePattern = renderEventNamePattern
cfg.Port = port cfg.Port = port
cfg.driver = NewRAM() cfg.driver = NewRAM()
cfg.storage = NewStorage(cfg.driver) cfg.storage = NewStorage(cfg.driver)
@ -120,7 +123,7 @@ func TestRun(t *testing.T) {
} }
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
t.Fatal(err) 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) t.Fatal(result.EventNames)
} else { } else {
t.Logf("%+v", result) t.Logf("%+v", result)
@ -215,14 +218,17 @@ func TestRun(t *testing.T) {
t.Fatalf("(%d) %s", resp.StatusCode, b) 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 var lastLine []string
for { for {
line, err := dec.Read() line, err := dec.Read()
if err == io.EOF { if err == io.EOF {
break break
} else if err != nil { } else if err != nil {
t.Error(err) t.Error("unexpected error while reading csv line:", err)
} }
if lastLine == nil { 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.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 lastLine = line
} }
if lastLine == nil { if lastLine == nil {

View File

@ -113,13 +113,20 @@ func ParseSlack(b []byte, assetPattern, datacenterPattern, eventNamePattern stri
return Message{}, err return Message{}, err
} }
asset := regexp.MustCompile(assetPattern) for pattern, ptr := range map[string]*string{
datacenter := regexp.MustCompile(datacenterPattern) assetPattern: &m.Asset,
eventName := regexp.MustCompile(eventNamePattern) datacenterPattern: &m.Datacenter,
eventNamePattern: &m.EventName,
m.Asset = asset.FindString(m.Asset) } {
m.Datacenter = datacenter.FindString(m.Datacenter) r := regexp.MustCompile(pattern)
m.EventName = eventName.FindString(m.EventName) parsed := r.FindString(*ptr)
for i, name := range r.SubexpNames() {
if i > 0 && name != "" {
parsed = r.FindStringSubmatch(*ptr)[i]
}
}
*ptr = parsed
}
return m, nil return m, nil
} }

View File

@ -7,12 +7,6 @@ import (
"testing" "testing"
) )
var (
renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]`
renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]`
renderEventNamePattern = `(^\[[^\]]*\] *)?(?P<result>.*)`
)
func TestParseSlackTestdata(t *testing.T) { func TestParseSlackTestdata(t *testing.T) {
cases := map[string]struct { cases := map[string]struct {
slackMessage slackMessage slackMessage slackMessage
@ -130,8 +124,8 @@ func TestParseSlackTestdata(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
t.Run("parseSlackJSON", func(t *testing.T) { t.Run("_parseSlackJSON", func(t *testing.T) {
got, err := parseSlackJSON(b) got, err := _parseSlackJSON(b)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }