helpers.go 3.4 KB

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