helpers.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // package helpers -- содержит всякие полезняшки.
  2. //
  3. // Пакет импортировать где нужно в нотации `. "gitlab.c2g.pw/back/uaj-abstract-client/pkg/helpers"`
  4. package helpers
  5. import (
  6. "fmt"
  7. "log"
  8. "os"
  9. "time"
  10. "reflect"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
  12. )
  13. var (
  14. IsStageLocal def_spec_base.Bool
  15. IsStageProd def_spec_base.Bool
  16. )
  17. type AssertAction struct {
  18. isCond def_spec_base.Bool
  19. }
  20. // Hassert -- проверка на правильность утверждения с безусловным падением в панику даже на проде (hard assert).
  21. func (sf *AssertAction) Hassert(msgFormat def_spec_base.ATxt, args ...any) {
  22. if !sf.isCond {
  23. return
  24. }
  25. msg := fmt.Sprintf("HARD ASSERT "+string(msgFormat)+"\n", args...)
  26. panic(msg)
  27. }
  28. // Assert -- проверка на правильность утверждения с падением в панику кроме прода (soft assert).
  29. func (sf *AssertAction) Assert(msgFormat def_spec_base.ATxt, args ...any) {
  30. if !sf.isCond {
  31. return
  32. }
  33. msg := fmt.Sprintf("SOFT ASSERT"+string(msgFormat)+"\n", args...)
  34. if IsStageLocal {
  35. panic(msg)
  36. }
  37. log.Print(msg)
  38. }
  39. // If -- условие для проверки.
  40. func If(isCond def_spec_base.Bool) *AssertAction {
  41. sf := &AssertAction{
  42. isCond: isCond,
  43. }
  44. return sf
  45. }
  46. // FnHassert -- проверяет с жёстким падением условие.
  47. //
  48. // (isCond bool, msgFormat defs.Str, args ...any)
  49. // type FnHassert func(isCond d_ef_spec.Bool, msgFormat d_ef_spec.ATxt, args ...any)
  50. // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
  51. // func Hassert(isCond d_ef_spec.Bool, msgFormat d_ef_spec.ATxt, args ...any) {
  52. // if isCond {
  53. // return
  54. // }
  55. // msg := d_ef_spec.Sprintf("HARD ASSERT "+msgFormat+"\n", args...)
  56. // panic(msg)
  57. // }
  58. // TimeNow -- возвращает локальное Unix сейчас-время (мсек, не зависит от положения).
  59. func TimeNow() int64 {
  60. timeNow := time.Now().Local().UnixMilli()
  61. return timeNow
  62. }
  63. // SleepMs -- спит миллисекунду (иногда бывает полезно).
  64. func SleepMs() {
  65. time.Sleep(time.Millisecond * 1)
  66. }
  67. func init_() {
  68. strStage := os.Getenv("STAGE")
  69. switch strStage {
  70. case "local":
  71. IsStageLocal = true
  72. IsStageProd = false
  73. case "prod":
  74. IsStageProd = true
  75. IsStageLocal = false
  76. case "":
  77. IsStageLocal = true
  78. IsStageProd = false
  79. default:
  80. panic(fmt.Sprintf("lepers.init_(): unknown env STAGE (%v)\n", strStage))
  81. }
  82. }
  83. // IsNil -- проверяет абсолютно любой Go-объект на nil.
  84. // Она безопасно обрабатывает как прямые nil-значения, так и "типизированные" nil
  85. // (когда интерфейс содержит внутри себя nil-указатель).
  86. func IsNil(i any) def_spec_base.Bool {
  87. if i == nil {
  88. return true
  89. }
  90. val := reflect.ValueOf(i)
  91. switch val.Kind() {
  92. case reflect.Pointer, reflect.Chan, reflect.Map, reflect.Slice, reflect.Func, reflect.Interface:
  93. return def_spec_base.Bool(val.IsNil())
  94. default:
  95. // Все остальные типы (структуры, int, string, bool) не могут быть nil
  96. return false
  97. }
  98. }
  99. func init() {
  100. init_()
  101. }