From 95a258ac321c8c38d245e1cbff44ae51a84c4420 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Thu, 27 Nov 2025 09:22:52 +0000 Subject: [PATCH] refactor: replace deprecated strings.Title with custom titleCase Add simple titleCase functions that handle ASCII strings without the Unicode punctuation issues of strings.Title. --- internal/mock/generator.go | 24 +++++++++++++++++++++++- internal/notifications/email_template.go | 23 +++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/internal/mock/generator.go b/internal/mock/generator.go index 5d50cdd..532b157 100644 --- a/internal/mock/generator.go +++ b/internal/mock/generator.go @@ -12,6 +12,28 @@ import ( "github.com/rcourtman/pulse-go-rewrite/internal/models" ) +// titleCase capitalizes the first letter of each word (simple ASCII-safe version) +func titleCase(s string) string { + var result strings.Builder + capitalizeNext := true + for _, r := range s { + if unicode.IsSpace(r) || r == '-' { + capitalizeNext = true + if r == '-' { + result.WriteRune(' ') + } else { + result.WriteRune(r) + } + } else if capitalizeNext { + result.WriteRune(unicode.ToUpper(r)) + capitalizeNext = false + } else { + result.WriteRune(unicode.ToLower(r)) + } + } + return result.String() +} + type MockConfig struct { NodeCount int VMsPerNode int @@ -2468,7 +2490,7 @@ func generateCephClusters(nodes []models.Node, storage []models.Storage) []model cluster := models.CephCluster{ ID: fmt.Sprintf("%s-ceph", instanceName), Instance: instanceName, - Name: fmt.Sprintf("%s Ceph", strings.Title(strings.ReplaceAll(instanceName, "-", " "))), + Name: fmt.Sprintf("%s Ceph", titleCase(instanceName)), FSID: fmt.Sprintf("00000000-0000-4000-8000-%012d", rand.Int63n(1_000_000_000_000)), Health: health, HealthMessage: healthMessage, diff --git a/internal/notifications/email_template.go b/internal/notifications/email_template.go index 15c4273..d1493a4 100644 --- a/internal/notifications/email_template.go +++ b/internal/notifications/email_template.go @@ -4,10 +4,29 @@ import ( "fmt" "strings" "time" + "unicode" "github.com/rcourtman/pulse-go-rewrite/internal/alerts" ) +// titleCase capitalizes the first letter of each word (simple ASCII-safe version) +func titleCase(s string) string { + var result strings.Builder + capitalizeNext := true + for _, r := range s { + if unicode.IsSpace(r) { + capitalizeNext = true + result.WriteRune(r) + } else if capitalizeNext { + result.WriteRune(unicode.ToUpper(r)) + capitalizeNext = false + } else { + result.WriteRune(unicode.ToLower(r)) + } + } + return result.String() +} + // EmailTemplate generates a professional HTML email template for alerts func EmailTemplate(alertList []*alerts.Alert, isSingle bool) (subject, htmlBody, textBody string) { if isSingle && len(alertList) == 1 { @@ -36,11 +55,11 @@ func singleAlertTemplate(alert *alerts.Alert) (subject, htmlBody, textBody strin case "io": alertType = "I/O" default: - alertType = strings.Title(alertType) + alertType = titleCase(alertType) } subject = fmt.Sprintf("[Pulse Alert] %s: %s on %s", - strings.Title(string(alert.Level)), alertType, alert.ResourceName) + titleCase(string(alert.Level)), alertType, alert.ResourceName) htmlBody = fmt.Sprintf(`