kern.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. // package kern -- библиотека гибкого универсального облегчённого ядра для любого микросервиса.
  2. package kern
  3. import (
  4. "context"
  5. "fmt"
  6. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
  8. mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  9. mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http/client_bus_http"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local/client_bus_local"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  15. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
  16. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmonolit"
  17. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
  18. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kstore_kv"
  19. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_kctx"
  20. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_keeper"
  21. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http"
  22. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_wui"
  23. )
  24. // GetKernelCtx -- возвращает контекст ядра.
  25. func GetKernelCtx() *mL0.Result[mKt.IKernelCtx] {
  26. resCtx := kctx.GetKernelCtx()
  27. if resCtx.IsErr() {
  28. err := fmt.Errorf("GetKernelCtx(): err=\n\t%w", resCtx.Err())
  29. return NewErr[mKt.IKernelCtx](err)
  30. }
  31. return NewRes(mKt.IKernelCtx(resCtx.Val()))
  32. }
  33. // NewErr -- возвращает Result с ошибкой.
  34. func NewErr[T any](err error) *mL0.Result[T] {
  35. return mL0.NewErr[T](err)
  36. }
  37. // NewRes -- возвращает успешный Result с значением.
  38. func NewRes[T any](res T) *mL0.Result[T] {
  39. return mL0.NewRes(res)
  40. }
  41. // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
  42. func WrapErr[T any](res *mL0.Result[T], err error) *mL0.Result[T] {
  43. return mL0.WrapErr(res, err)
  44. }
  45. // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра.
  46. func GetKernelStoreKv() *mL0.Result[mKt.IKernelStoreKv] {
  47. resStore := kstore_kv.GetKernelStore()
  48. if resStore.IsErr() {
  49. err := fmt.Errorf("GetKernelStoreKv(): err=\n\t%w", resStore.Err())
  50. return NewErr[mKt.IKernelStoreKv](err)
  51. }
  52. store := mKt.IKernelStoreKv(resStore.Val())
  53. return NewRes(store)
  54. }
  55. // GetKernelServerHttp -- возвращает веб-сервер ядра.
  56. func GetKernelServerHttp() *mL0.Result[mKt.IKernelServerHttp] {
  57. kernServHttp := kserv_http.GetKernelServHttp()
  58. return kernServHttp
  59. }
  60. // NewSafeBool -- возвращает новый потокобезопасный булевый признак.
  61. func NewSafeBool() mKt.ISafeBool {
  62. sb := mL1.NewSafeBool()
  63. return sb
  64. }
  65. // GetKernelBusLocal -- возвращает локальную шину данных.
  66. func GetKernelBusLocal() *mL0.Result[mKt.IKernelBus] {
  67. resCtx := kctx.GetKernelCtx()
  68. if resCtx.IsErr() {
  69. err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resCtx.Err())
  70. return NewErr[mKt.IKernelBus](err)
  71. }
  72. kCtx := resCtx.Val()
  73. resSet := kCtx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()")
  74. if resSet.IsErr() {
  75. err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resSet.Err())
  76. return NewErr[mKt.IKernelBus](err)
  77. }
  78. resBus := kbus_local.GetKernelBusLocal()
  79. if resBus.IsErr() {
  80. err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resBus.Err())
  81. return NewErr[mKt.IKernelBus](err)
  82. }
  83. bus := mKt.IKernelBus(resBus.Val())
  84. return NewRes(bus)
  85. }
  86. // GetKernelBusHttp -- возвращает HTTP шину данных.
  87. func GetKernelBusHttp() *mL0.Result[mKt.IKernelBus] {
  88. bus := kbus_http.GetKernelBusHttp()
  89. return bus
  90. }
  91. // SleepMs -- спит миллисекунду.
  92. func SleepMs() {
  93. mL1.SleepMs()
  94. }
  95. // GetMonolitLocal -- возвращает монолит с локальной шиной.
  96. func GetMonolitLocal(name string) *mL0.Result[mKt.IKernelMonolit] {
  97. resCtx := kctx.GetKernelCtx()
  98. if resCtx.IsErr() {
  99. err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resCtx.Err())
  100. return NewErr[mKt.IKernelMonolit](err)
  101. }
  102. kCtx := resCtx.Val()
  103. resSet := kCtx.Set("isLocal", true, "bus type")
  104. if resSet.IsErr() {
  105. err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resSet.Err())
  106. return NewErr[mKt.IKernelMonolit](err)
  107. }
  108. for {
  109. SleepMs()
  110. optIsLocal := kCtx.Get("isLocal")
  111. if optIsLocal.IsVal() {
  112. break
  113. }
  114. }
  115. res := kmonolit.GetMonolit(name)
  116. if res.IsErr() {
  117. err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", res.Err())
  118. return NewErr[mKt.IKernelMonolit](err)
  119. }
  120. _ = kbus_local.GetKernelBusLocal()
  121. return NewRes(mKt.IKernelMonolit(res.Val()))
  122. }
  123. // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP.
  124. func GetMonolitHttp(name string) *mL0.Result[mKt.IKernelMonolit] {
  125. resCtx := kctx.GetKernelCtx()
  126. if resCtx.IsErr() {
  127. err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resCtx.Err())
  128. return NewErr[mKt.IKernelMonolit](err)
  129. }
  130. kCtx := resCtx.Val()
  131. _ = kbus_http.GetKernelBusHttp()
  132. resSet := kCtx.Set("isLocal", false, "bus type")
  133. if resSet.IsErr() {
  134. err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resSet.Err())
  135. return NewErr[mKt.IKernelMonolit](err)
  136. }
  137. for {
  138. SleepMs()
  139. optIsLocal := kCtx.Get("isLocal")
  140. if optIsLocal.IsVal() {
  141. break
  142. }
  143. }
  144. res := kmonolit.GetMonolit(name)
  145. if res.IsErr() {
  146. err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", res.Err())
  147. return NewErr[mKt.IKernelMonolit](err)
  148. }
  149. return NewRes(mKt.IKernelMonolit(res.Val()))
  150. }
  151. // NewKernelModule -- возвращает новый модуль на ядре.
  152. func NewKernelModule(name *mKa.AModuleName) *mL0.Result[mKt.IKernelModule] {
  153. resMod := kmodule.NewKernelModule(name)
  154. return resMod
  155. }
  156. // NewClientBusLocal -- возвращает клиент для работы с локальной шиной.
  157. func NewClientBusLocal() *mL0.Result[mKt.IBusClient] {
  158. res := client_bus_local.NewClientBusLocal()
  159. if res.IsErr() {
  160. err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", res.Err())
  161. return NewErr[mKt.IBusClient](err)
  162. }
  163. client := res.Val()
  164. return NewRes(client)
  165. }
  166. // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
  167. func NewClientBusHttp(url string) *mL0.Result[mKt.IBusClient] {
  168. client := client_bus_http.NewClientBusHttp(url)
  169. return client
  170. }
  171. // GetModuleServHttp -- возвращает модуль для IKernelServHttp.
  172. func GetModuleServHttp() *mL0.Result[mKt.IKernelModule] {
  173. resHttp := mod_serv_http.GetModuleServHttp()
  174. if resHttp.IsErr() {
  175. err := fmt.Errorf("GetModuleServHttp(): err=\n\t%w", resHttp.Err())
  176. return NewErr[mKt.IKernelModule](err)
  177. }
  178. modServHttp := resHttp.Val()
  179. return NewRes(mKt.IKernelModule(modServHttp))
  180. }
  181. // GetModuleKernelCtx -- возвращает модуль для IKernelCtx.
  182. func GetModuleKernelCtx() *mL0.Result[mKt.IKernelModule] {
  183. resMod := mod_kctx.GetModuleKernelCtx()
  184. if resMod.IsErr() {
  185. err := fmt.Errorf("GetModuleKernelCtx(): err=\n\t%w", resMod.Err())
  186. return NewErr[mKt.IKernelModule](err)
  187. }
  188. mod := resMod.Val()
  189. return NewRes(mKt.IKernelModule(mod))
  190. }
  191. // GetModuleKernelKeeper -- возвращает модуль для IKernelKeeper.
  192. func GetModuleKernelKeeper() *mL0.Result[mKt.IKernelModule] {
  193. resKeeper := mod_keeper.GetModuleKeeper()
  194. if resKeeper.IsErr() {
  195. err := fmt.Errorf("GetModuleKernelKeeper(): err=\n\t%w", resKeeper.Err())
  196. return NewErr[mKt.IKernelModule](err)
  197. }
  198. modKernelKeeper := resKeeper.Val()
  199. return NewRes(mKt.IKernelModule(modKernelKeeper))
  200. }
  201. // GetModuleWui -- возвращает модуль для WUI.
  202. func GetModuleWui() *mL0.Result[mKt.IKernelModule] {
  203. resMod := mod_wui.GetModuleWui()
  204. if resMod.IsErr() {
  205. err := fmt.Errorf("GetModuleWui(): err=\n\t%w", resMod.Err())
  206. return NewErr[mKt.IKernelModule](err)
  207. }
  208. modWui := resMod.Val()
  209. return NewRes(mKt.IKernelModule(modWui))
  210. }
  211. // NewLogBuf -- возвращает новый буферизованный лог.
  212. func NewLogBuf(opts ...mL1.OptionLogBuf) mKt.ILogBuf {
  213. log := mL1.NewLogBuf(opts...)
  214. return log
  215. }
  216. // NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
  217. func NewSafeBoolReact() mKt.ISafeBoolReact {
  218. val := mL1.NewSafeBoolReact()
  219. return val
  220. }
  221. // NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную.
  222. func NewSafeInt(val int) mKt.ISafeInt {
  223. val_ := mL1.NewSafeInt(val)
  224. return val_
  225. }
  226. // NewInt -- возвращает новую целочисленную переменную.
  227. func NewInt(val int) mKt.Int {
  228. val_ := mL1.NewInt(val)
  229. return val_
  230. }
  231. // NewLocalCtx -- возвращает новый локальный контекст.
  232. func NewLocalCtx(ctx context.Context) *mL0.Result[mKt.ILocalCtx] {
  233. resCtx := mL1.NewLocalCtx(ctx)
  234. if resCtx.IsErr() {
  235. err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
  236. return NewErr[mKt.ILocalCtx](err)
  237. }
  238. ctx_ := resCtx.Val()
  239. return NewRes(ctx_)
  240. }
  241. // NewSafeString -- возвращает новую потокобезопасную строку.
  242. func NewSafeString() mKt.ISafeString {
  243. str := mL1.NewSafeString()
  244. return str
  245. }
  246. // MakeOk -- возвращает новый положительный результат операции.
  247. func MakeOk[T any](res T) *mL0.Result[T] {
  248. return NewRes(res)
  249. }
  250. // MakeErr -- возвращает новую ошибку результат операции.
  251. func MakeErr[T any](err error) *mL0.Result[T] {
  252. return NewErr[T](err)
  253. }
  254. // NewOpt -- возвращает новый не пустой результат операции.
  255. func NewOpt[T any](some T) *mL0.Option[T] {
  256. return mL0.NewOpt(some)
  257. }
  258. // NewNone -- возвращает новый пустой результат операции.
  259. func NewNone[T any]() *mL0.Option[T] {
  260. return mL0.NewNone[T]()
  261. }
  262. // FnHassert -- проверяет с жёстким падением условие.
  263. type FnHassert = mL1.FnHassert
  264. // Hassert -- возвращает ссылку на функцию Hassert.
  265. func Hassert() FnHassert {
  266. return mL1.Hassert()
  267. }
  268. // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
  269. type FnAssert = mL1.FnAssert
  270. // Assert -- возвращает ссылку на функцию Hassert.
  271. func Assert() FnAssert {
  272. return mL1.Assert()
  273. }