remove_lines.go 714 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package testhelpers
  2. import (
  3. "fmt"
  4. "sort"
  5. "strings"
  6. )
  7. func RemoveLines(str string, lines ...int) (string, error) {
  8. if len(lines) == 0 {
  9. return str, nil
  10. }
  11. sort.Ints(lines)
  12. var b strings.Builder
  13. b.Grow(len(str))
  14. var count int
  15. var start int
  16. var lineID int
  17. for i, s := range str {
  18. if s != '\n' {
  19. continue
  20. }
  21. if lines[lineID] != count {
  22. b.WriteString(str[start:i])
  23. b.WriteString("\n")
  24. } else {
  25. lineID++
  26. if len(lines) <= lineID {
  27. b.WriteString(str[i+1:])
  28. break
  29. }
  30. }
  31. count++
  32. start = i + 1
  33. }
  34. if len(lines) > lineID {
  35. return str, fmt.Errorf("not all lines were removed: processed line ids before %d for lines %d", lineID, lines)
  36. }
  37. return b.String(), nil
  38. }