strings.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package util
  2. import (
  3. "fmt"
  4. "math"
  5. "regexp"
  6. "strings"
  7. "time"
  8. )
  9. // StringsFallback2 returns the first of two not empty strings.
  10. func StringsFallback2(val1 string, val2 string) string {
  11. return stringsFallback(val1, val2)
  12. }
  13. // StringsFallback3 returns the first of three not empty strings.
  14. func StringsFallback3(val1 string, val2 string, val3 string) string {
  15. return stringsFallback(val1, val2, val3)
  16. }
  17. func stringsFallback(vals ...string) string {
  18. for _, v := range vals {
  19. if v != "" {
  20. return v
  21. }
  22. }
  23. return ""
  24. }
  25. // SplitString splits a string by commas or empty spaces.
  26. func SplitString(str string) []string {
  27. if len(str) == 0 {
  28. return []string{}
  29. }
  30. return regexp.MustCompile("[, ]+").Split(str, -1)
  31. }
  32. // GetAgeString returns a string representing certain time from years to minutes.
  33. func GetAgeString(t time.Time) string {
  34. if t.IsZero() {
  35. return "?"
  36. }
  37. sinceNow := time.Since(t)
  38. minutes := sinceNow.Minutes()
  39. years := int(math.Floor(minutes / 525600))
  40. months := int(math.Floor(minutes / 43800))
  41. days := int(math.Floor(minutes / 1440))
  42. hours := int(math.Floor(minutes / 60))
  43. if years > 0 {
  44. return fmt.Sprintf("%dy", years)
  45. }
  46. if months > 0 {
  47. return fmt.Sprintf("%dM", months)
  48. }
  49. if days > 0 {
  50. return fmt.Sprintf("%dd", days)
  51. }
  52. if hours > 0 {
  53. return fmt.Sprintf("%dh", hours)
  54. }
  55. if int(minutes) > 0 {
  56. return fmt.Sprintf("%dm", int(minutes))
  57. }
  58. return "< 1m"
  59. }
  60. // ToCamelCase changes kebab case, snake case or mixed strings to camel case. See unit test for examples.
  61. func ToCamelCase(str string) string {
  62. var finalParts []string
  63. parts := strings.Split(str, "_")
  64. for _, part := range parts {
  65. finalParts = append(finalParts, strings.Split(part, "-")...)
  66. }
  67. for index, part := range finalParts[1:] {
  68. finalParts[index+1] = strings.Title(part)
  69. }
  70. return strings.Join(finalParts, "")
  71. }