package redactutil import ( "fmt" "regexp" "strings" ) func NormalizeMask(mask string) string { mask = strings.TrimSpace(mask) if mask == "" { return "[REDACTED]" } return mask } func BuildFieldSet(fields ...string) map[string]struct{} { fieldMap := make(map[string]struct{}, len(fields)) for _, field := range fields { field = strings.TrimSpace(strings.ToLower(field)) if field == "" { continue } fieldMap[field] = struct{}{} } return fieldMap } func LookupFieldKey(key string) string { return strings.TrimSpace(strings.ToLower(key)) } func MaskFields(fields map[string]interface{}, mask string) map[string]interface{} { if len(fields) == 0 { return nil } mask = NormalizeMask(mask) masked := make(map[string]interface{}, len(fields)) for key := range fields { masked[key] = mask } return masked } func ReplaceRegex(pattern *regexp.Regexp, text string, replacement string) (string, bool) { if pattern == nil || text == "" { return text, false } if replacement == "" { replacement = "[REDACTED]" } changed := pattern.ReplaceAllString(text, replacement) return changed, changed != text } func IsMasked(value interface{}, mask string) bool { return fmt.Sprint(value) == mask }