stringutils.go 2.4 KB

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