package tools import ( "fmt" "strings" ) // maxLineRunes caps a single line so one minified bundle cannot flood the // context window. const maxLineRunes = 2000 // capLine shortens an over-long line, saying by how much. func capLine(s string) string { r := []rune(s) if len(r) <= maxLineRunes { return s } return fmt.Sprintf("%s… (%d more characters on this line)", string(r[:maxLineRunes]), len(r)-maxLineRunes) } // headTail caps output by keeping the first and last n lines. Head-only // truncation loses the end of the output, which for a test run is exactly the // part that matters. func headTail(s string, head, tail int) string { lines := strings.Split(s, "\n") if len(lines) <= head+tail { return s } elided := len(lines) - head - tail kept := make([]string, 0, head+tail+1) kept = append(kept, lines[:head]...) kept = append(kept, fmt.Sprintf("… %d lines elided …", elided)) kept = append(kept, lines[len(lines)-tail:]...) return strings.Join(kept, "\n") }