81 lines
1.9 KiB
Go
81 lines
1.9 KiB
Go
|
|
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 ©
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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 ©
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
}
|