mirror of
https://github.com/cexll/myclaude.git
synced 2026-02-06 02:34:09 +08:00
- Move all source files to internal/{app,backend,config,executor,logger,parser,utils}
- Integrate third-party libraries: zerolog, goccy/go-json, gopsutil, cobra/viper
- Add comprehensive unit tests for utils package (94.3% coverage)
- Add performance benchmarks for string operations
- Fix error display: cleanup warnings no longer pollute Recent Errors
- Add GitHub Actions CI workflow
- Add Makefile for build automation
- Add README documentation
Generated with SWE-Agent.ai
Co-Authored-By: SWE-Agent.ai <noreply@swe-agent.ai>
63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package utils
|
|
|
|
import "strings"
|
|
|
|
func Truncate(s string, maxLen int) string {
|
|
if len(s) <= maxLen {
|
|
return s
|
|
}
|
|
if maxLen < 0 {
|
|
return ""
|
|
}
|
|
return s[:maxLen] + "..."
|
|
}
|
|
|
|
// SafeTruncate safely truncates string to maxLen, avoiding panic and UTF-8 corruption.
|
|
func SafeTruncate(s string, maxLen int) string {
|
|
if maxLen <= 0 || s == "" {
|
|
return ""
|
|
}
|
|
|
|
runes := []rune(s)
|
|
if len(runes) <= maxLen {
|
|
return s
|
|
}
|
|
|
|
if maxLen < 4 {
|
|
return string(runes[:1])
|
|
}
|
|
|
|
cutoff := maxLen - 3
|
|
if cutoff <= 0 {
|
|
return string(runes[:1])
|
|
}
|
|
if len(runes) <= cutoff {
|
|
return s
|
|
}
|
|
return string(runes[:cutoff]) + "..."
|
|
}
|
|
|
|
// SanitizeOutput removes ANSI escape sequences and control characters.
|
|
func SanitizeOutput(s string) string {
|
|
var result strings.Builder
|
|
inEscape := false
|
|
for i := 0; i < len(s); i++ {
|
|
if s[i] == '\x1b' && i+1 < len(s) && s[i+1] == '[' {
|
|
inEscape = true
|
|
i++ // skip '['
|
|
continue
|
|
}
|
|
if inEscape {
|
|
if (s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z') {
|
|
inEscape = false
|
|
}
|
|
continue
|
|
}
|
|
// Keep printable chars and common whitespace.
|
|
if s[i] >= 32 || s[i] == '\n' || s[i] == '\t' {
|
|
result.WriteByte(s[i])
|
|
}
|
|
}
|
|
return result.String()
|
|
}
|