stringutils.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Package stringutils provides helper functions for dealing with strings.
  2. package stringutils
  3. import (
  4. "bytes"
  5. "math/rand"
  6. "strings"
  7. )
  8. // GenerateRandomAlphaOnlyString generates an alphabetical random string with length n.
  9. func GenerateRandomAlphaOnlyString(n int) string {
  10. // make a really long string
  11. letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
  12. b := make([]byte, n)
  13. for i := range b {
  14. b[i] = letters[rand.Intn(len(letters))]
  15. }
  16. return string(b)
  17. }
  18. // GenerateRandomASCIIString generates an ASCII random string with length n.
  19. func GenerateRandomASCIIString(n int) string {
  20. chars := "abcdefghijklmnopqrstuvwxyz" +
  21. "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
  22. "~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` "
  23. res := make([]byte, n)
  24. for i := 0; i < n; i++ {
  25. res[i] = chars[rand.Intn(len(chars))]
  26. }
  27. return string(res)
  28. }
  29. // Ellipsis truncates a string to fit within maxlen, and appends ellipsis (...).
  30. // For maxlen of 3 and lower, no ellipsis is appended.
  31. func Ellipsis(s string, maxlen int) string {
  32. r := []rune(s)
  33. if len(r) <= maxlen {
  34. return s
  35. }
  36. if maxlen <= 3 {
  37. return string(r[:maxlen])
  38. }
  39. return string(r[:maxlen-3]) + "..."
  40. }
  41. // Truncate truncates a string to maxlen.
  42. func Truncate(s string, maxlen int) string {
  43. r := []rune(s)
  44. if len(r) <= maxlen {
  45. return s
  46. }
  47. return string(r[:maxlen])
  48. }
  49. // InSlice tests whether a string is contained in a slice of strings or not.
  50. // Comparison is case insensitive
  51. func InSlice(slice []string, s string) bool {
  52. for _, ss := range slice {
  53. if strings.ToLower(s) == strings.ToLower(ss) {
  54. return true
  55. }
  56. }
  57. return false
  58. }
  59. func quote(word string, buf *bytes.Buffer) {
  60. // Bail out early for "simple" strings
  61. if word != "" && !strings.ContainsAny(word, "\\'\"`${[|&;<>()~*?! \t\n") {
  62. buf.WriteString(word)
  63. return
  64. }
  65. buf.WriteString("'")
  66. for i := 0; i < len(word); i++ {
  67. b := word[i]
  68. if b == '\'' {
  69. // Replace literal ' with a close ', a \', and an open '
  70. buf.WriteString("'\\''")
  71. } else {
  72. buf.WriteByte(b)
  73. }
  74. }
  75. buf.WriteString("'")
  76. }
  77. // ShellQuoteArguments takes a list of strings and escapes them so they will be
  78. // handled right when passed as arguments to a program via a shell
  79. func ShellQuoteArguments(args []string) string {
  80. var buf bytes.Buffer
  81. for i, arg := range args {
  82. if i != 0 {
  83. buf.WriteByte(' ')
  84. }
  85. quote(arg, &buf)
  86. }
  87. return buf.String()
  88. }