string.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package stringx
  2. import (
  3. "bytes"
  4. "strings"
  5. "unicode"
  6. )
  7. const (
  8. emptyString = ""
  9. )
  10. type (
  11. String struct {
  12. source string
  13. }
  14. )
  15. func From(data string) String {
  16. return String{source: data}
  17. }
  18. func (s String) IsEmptyOrSpace() bool {
  19. if len(s.source) == 0 {
  20. return true
  21. }
  22. if strings.TrimSpace(s.source) == "" {
  23. return true
  24. }
  25. return false
  26. }
  27. func (s String) Lower() string {
  28. if s.IsEmptyOrSpace() {
  29. return s.source
  30. }
  31. return strings.ToLower(s.source)
  32. }
  33. func (s String) Upper() string {
  34. if s.IsEmptyOrSpace() {
  35. return s.source
  36. }
  37. return strings.ToUpper(s.source)
  38. }
  39. func (s String) Title() string {
  40. if s.IsEmptyOrSpace() {
  41. return s.source
  42. }
  43. return strings.Title(s.source)
  44. }
  45. // snake->camel(upper start)
  46. func (s String) Snake2Camel() string {
  47. if s.IsEmptyOrSpace() {
  48. return s.source
  49. }
  50. list := s.splitBy(func(r rune) bool {
  51. return r == '_'
  52. }, true)
  53. var target []string
  54. for _, item := range list {
  55. target = append(target, From(item).Title())
  56. }
  57. return strings.Join(target, "")
  58. }
  59. // camel->snake
  60. func (s String) Camel2Snake() string {
  61. if s.IsEmptyOrSpace() {
  62. return s.source
  63. }
  64. list := s.splitBy(func(r rune) bool {
  65. return unicode.IsUpper(r)
  66. }, false)
  67. var target []string
  68. for _, item := range list {
  69. target = append(target, From(item).Lower())
  70. }
  71. return strings.Join(target, "_")
  72. }
  73. // return original string if rune is not letter at index 0
  74. func (s String) LowerStart() string {
  75. if s.IsEmptyOrSpace() {
  76. return s.source
  77. }
  78. r := rune(s.source[0])
  79. if !unicode.IsUpper(r) && !unicode.IsLower(r) {
  80. return s.source
  81. }
  82. return string(unicode.ToLower(r)) + s.source[1:]
  83. }
  84. // it will not ignore spaces
  85. func (s String) splitBy(fn func(r rune) bool, remove bool) []string {
  86. if s.IsEmptyOrSpace() {
  87. return nil
  88. }
  89. var list []string
  90. buffer := new(bytes.Buffer)
  91. for _, r := range s.source {
  92. if fn(r) {
  93. if buffer.Len() != 0 {
  94. list = append(list, buffer.String())
  95. buffer.Reset()
  96. }
  97. if !remove {
  98. buffer.WriteRune(r)
  99. }
  100. continue
  101. }
  102. buffer.WriteRune(r)
  103. }
  104. if buffer.Len() != 0 {
  105. list = append(list, buffer.String())
  106. }
  107. return list
  108. }
  109. func (s String) ReplaceAll(old, new string) string {
  110. return strings.ReplaceAll(s.source, old, new)
  111. }
  112. func (s String) Source() string {
  113. return s.source
  114. }