Files
weatherreporter/internal/promptexec/copy.go

81 lines
1.9 KiB
Go
Raw Blame History

package promptexec
import (
"strings"
"unicode/utf8"
)
func copyPreparation(value Preparation) Preparation {
value.InputHashes = copyStringMap(value.InputHashes)
return value
}
func copyPreparationDebug(value *PreparationDebug) *PreparationDebug {
if value == nil {
return nil
}
copy := *value
copy.RenderedMessages = append([]RenderedMessage(nil), value.RenderedMessages...)
copy.StructuredSchema = append([]byte(nil), value.StructuredSchema...)
copy.ParametersJSON = append([]byte(nil), value.ParametersJSON...)
return &copy
}
func copyExecution(value Execution) Execution {
value.InputHashes = copyStringMap(value.InputHashes)
value.Validation.Diagnostics = boundDiagnostics(value.Validation.Diagnostics)
value.RawOutput = append([]byte(nil), value.RawOutput...)
value.Debug = copyExecutionDebug(value.Debug)
return value
}
func copyExecutionDebug(value *ExecutionDebug) *ExecutionDebug {
if value == nil {
return nil
}
copy := *value
copy.RawOutput = append([]byte(nil), value.RawOutput...)
copy.ValidationDiagnostics = boundDiagnostics(value.ValidationDiagnostics)
return &copy
}
func copyStringMap(value map[string]string) map[string]string {
if value == nil {
return nil
}
copy := make(map[string]string, len(value))
for key, item := range value {
copy[key] = item
}
return copy
}
func boundDiagnostics(values []string) []string {
if len(values) == 0 {
return nil
}
if len(values) > maxValidationDiagnostics {
values = values[:maxValidationDiagnostics]
}
bounded := make([]string, len(values))
for index, value := range values {
bounded[index] = boundText(value, maxDiagnosticBytes)
}
return bounded
}
func boundText(value string, limit int) string {
if limit <= 0 || value == "" {
return ""
}
value = strings.ToValidUTF8(value, "<22>")
if len(value) <= limit {
return value
}
value = value[:limit]
for len(value) > 0 && !utf8.ValidString(value) {
value = value[:len(value)-1]
}
return value
}