package generatedtext import ( "fmt" "strings" ) type dayStyleFields struct { Summary string ForecastDiscussion []string PrecipitationTiming string Confidence string } type dayStyleGeneratedText interface { dayStyleFields() dayStyleFields setDayStyleFields(dayStyleFields) } func validateDayStyleGeneratedText[T any, PT interface { *T dayStyleGeneratedText }](data []byte, name string) (T, []byte, error) { value, err := decodeGeneratedText[T](data, name) if err != nil { var zero T return zero, nil, err } pointer := PT(&value) fields := pointer.dayStyleFields() fields.Summary = strings.TrimSpace(fields.Summary) fields.PrecipitationTiming = strings.TrimSpace(fields.PrecipitationTiming) fields.Confidence = strings.TrimSpace(fields.Confidence) fields.ForecastDiscussion = trimNonEmpty(fields.ForecastDiscussion) if fields.Summary == "" { var zero T return zero, nil, fmt.Errorf("%s generated text summary is required", name) } if len(fields.ForecastDiscussion) == 0 { var zero T return zero, nil, fmt.Errorf("%s generated text forecast discussion is required", name) } pointer.setDayStyleFields(fields) normalized, err := normalizeGeneratedText(value, name) if err != nil { var zero T return zero, nil, err } return value, normalized, nil } func trimNonEmpty(values []string) []string { out := make([]string, 0, len(values)) for _, value := range values { trimmed := strings.TrimSpace(value) if trimmed != "" { out = append(out, trimmed) } } return out }