strings.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package app
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "github.com/maxence-charriere/go-app/v9/pkg/errors"
  10. )
  11. func toString(v any) string {
  12. switch v := v.(type) {
  13. case string:
  14. return v
  15. case []byte:
  16. return string(v)
  17. case int:
  18. return strconv.Itoa(v)
  19. case float64:
  20. return strconv.FormatFloat(v, 'f', 4, 64)
  21. case bool:
  22. return strconv.FormatBool(v)
  23. case nil:
  24. return ""
  25. default:
  26. return fmt.Sprint(v)
  27. }
  28. }
  29. func toPath(v ...any) string {
  30. var b strings.Builder
  31. for _, o := range v {
  32. s := toString(o)
  33. if s == "" {
  34. continue
  35. }
  36. b.WriteByte('/')
  37. b.WriteString(s)
  38. }
  39. return b.String()
  40. }
  41. func writeIndent(w io.Writer, indent int) {
  42. for i := 0; i < indent*2; i++ {
  43. io.WriteString(w, " ")
  44. }
  45. }
  46. func ln() []byte {
  47. return []byte("\n")
  48. }
  49. func pxToString(px int) string {
  50. return strconv.Itoa(px) + "px"
  51. }
  52. func stringTo(s string, v any) error {
  53. val := reflect.ValueOf(v)
  54. if val.Kind() != reflect.Ptr {
  55. return errors.New("receiver in not a pointer").Tag("receiver-type", val.Type())
  56. }
  57. val = val.Elem()
  58. switch val.Kind() {
  59. case reflect.String:
  60. val.SetString(s)
  61. case reflect.Int,
  62. reflect.Int8,
  63. reflect.Int16,
  64. reflect.Int32,
  65. reflect.Int64:
  66. i, _ := strconv.ParseInt(s, 10, 0)
  67. val.SetInt(i)
  68. case reflect.Uint,
  69. reflect.Uint8,
  70. reflect.Uint16,
  71. reflect.Uint32,
  72. reflect.Uint64:
  73. i, _ := strconv.ParseUint(s, 10, 0)
  74. val.SetUint(i)
  75. case reflect.Float64:
  76. f, _ := strconv.ParseFloat(s, 64)
  77. val.SetFloat(f)
  78. case reflect.Float32:
  79. f, _ := strconv.ParseFloat(s, 32)
  80. val.SetFloat(f)
  81. default:
  82. return errors.New("string cannot be converted to receiver type").
  83. Tag("string", s).
  84. Tag("receiver-type", val.Type())
  85. }
  86. return nil
  87. }
  88. // AppendClass adds c to the given class string.
  89. func AppendClass(class, c string) string {
  90. if c == "" {
  91. return class
  92. }
  93. if class != "" {
  94. class += " "
  95. }
  96. class += c
  97. return class
  98. }
  99. func jsonString(v any) string {
  100. b, err := json.Marshal(v)
  101. if err != nil {
  102. panic(errors.New("converting value to json string failed").Wrap(err))
  103. }
  104. return string(b)
  105. }