// package kern -- библиотека гибкого универсального облегчённого ядра для любого микросервиса package kern import ( "context" "fmt" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" "gitp78su.ipnodns.ru/svi/kern/v4/lev1" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http/client_bus_http" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local/client_bus_local" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmonolit" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kstore_kv" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_kctx" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_keeper" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_wui" ) // GetKernelCtx -- возвращает контекст ядра func GetKernelCtx() IResult[IKernelCtx] { resCtx := kctx.GetKernelCtx() if resCtx.IsErr() { err := fmt.Errorf("GetKernelCtx(): err=\n\t%w", resCtx.Err()) return NewErr[IKernelCtx](err) } return NewRes(IKernelCtx(resCtx.Val())) } // NewErr -- возвращает Result с ошибкой func NewErr[T any](err error) IResult[T] { return lev1.NewErr[T](err) } // NewRes -- возвращает успешный Result с значением func NewRes[T any](res T) IResult[T] { return lev1.NewRes(res) } // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой func WrapErr[T any](res IResult[T], err error) IResult[T] { return lev1.WrapErr(res, err) } // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра func GetKernelStoreKv() IResult[IKernelStoreKv] { resStore := kstore_kv.GetKernelStore() if resStore.IsErr() { err := fmt.Errorf("GetKernelStoreKv(): err=\n\t%w", resStore.Err()) return NewErr[IKernelStoreKv](err) } store := IKernelStoreKv(resStore.Val()) return NewRes(store) } // GetKernelServerHttp -- возвращает веб-сервер ядра func GetKernelServerHttp() IResult[IKernelServerHttp] { kernServHttp := kserv_http.GetKernelServHttp() return kernServHttp } // NewSafeBool -- возвращает новый потокобезопасный булевый признак func NewSafeBool() ISafeBool { sb := lev1.NewSafeBool() return sb } // GetKernelBusLocal -- возвращает локальную шину данных func GetKernelBusLocal() IResult[IKernelBus] { resCtx := kctx.GetKernelCtx() if resCtx.IsErr() { err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resCtx.Err()) return NewErr[IKernelBus](err) } kCtx := resCtx.Val() resSet := kCtx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()") if resSet.IsErr() { err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resSet.Err()) return NewErr[IKernelBus](err) } resBus := kbus_local.GetKernelBusLocal() if resBus.IsErr() { err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resBus.Err()) return NewErr[IKernelBus](err) } bus := IKernelBus(resBus.Val()) return NewRes(bus) } // GetKernelBusHttp -- возвращает HTTP шину данных func GetKernelBusHttp() IResult[IKernelBus] { bus := kbus_http.GetKernelBusHttp() return bus } // SleepMs -- спит миллисекунду func SleepMs() { lev1.SleepMs() } // GetMonolitLocal -- возвращает монолит с локальной шиной func GetMonolitLocal(name string) IResult[IKernelMonolit] { resCtx := kctx.GetKernelCtx() if resCtx.IsErr() { err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resCtx.Err()) return NewErr[IKernelMonolit](err) } kCtx := resCtx.Val() resSet := kCtx.Set("isLocal", true, "bus type") if resSet.IsErr() { err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resSet.Err()) return NewErr[IKernelMonolit](err) } for { SleepMs() optIsLocal := kCtx.Get("isLocal") if optIsLocal.IsVal() { break } } res := kmonolit.GetMonolit(name) if res.IsErr() { err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", res.Err()) return NewErr[IKernelMonolit](err) } _ = kbus_local.GetKernelBusLocal() return NewRes(IKernelMonolit(res.Val())) } // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP func GetMonolitHttp(name string) IResult[IKernelMonolit] { resCtx := kctx.GetKernelCtx() if resCtx.IsErr() { err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resCtx.Err()) return NewErr[IKernelMonolit](err) } kCtx := resCtx.Val() _ = kbus_http.GetKernelBusHttp() resSet := kCtx.Set("isLocal", false, "bus type") if resSet.IsErr() { err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resSet.Err()) return NewErr[IKernelMonolit](err) } for { SleepMs() optIsLocal := kCtx.Get("isLocal") if optIsLocal.IsVal() { break } } res := kmonolit.GetMonolit(name) if res.IsErr() { err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", res.Err()) return NewErr[IKernelMonolit](err) } return NewRes(IKernelMonolit(res.Val())) } // NewKernelModule -- возвращает новый модуль на ядре func NewKernelModule(name AModuleName) IResult[IKernelModule] { resMod := kmodule.NewKernelModule(name) return resMod } // NewClientBusLocal -- возвращает клиент для работы с локальной шиной func NewClientBusLocal() IResult[IBusClient] { res := client_bus_local.NewClientBusLocal() if res.IsErr() { err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", res.Err()) return NewErr[IBusClient](err) } client := res.Val() return NewRes(IBusClient(client)) } // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP func NewClientBusHttp(url string) IResult[IBusClient] { client := client_bus_http.NewClientBusHttp(url) return client } // GetModuleServHttp -- возвращает модуль для IKernelServHttp func GetModuleServHttp() IResult[IKernelModule] { resHttp := mod_serv_http.GetModuleServHttp() if resHttp.IsErr() { err := fmt.Errorf("GetModuleServHttp(): err=\n\t%w", resHttp.Err()) return NewErr[IKernelModule](err) } modServHttp := resHttp.Val() return NewRes(IKernelModule(modServHttp)) } // GetModuleKernelCtx -- возвращает модуль для IKernelCtx func GetModuleKernelCtx() IResult[IKernelModule] { resMod := mod_kctx.GetModuleKernelCtx() if resMod.IsErr() { err := fmt.Errorf("GetModuleKernelCtx(): err=\n\t%w", resMod.Err()) return NewErr[IKernelModule](err) } mod := resMod.Val() return NewRes(IKernelModule(mod)) } // GetModuleKernelKeeper -- возвращает модуль для IKernelKeeper func GetModuleKernelKeeper() IResult[IKernelModule] { resKeeper := mod_keeper.GetModuleKeeper() if resKeeper.IsErr() { err := fmt.Errorf("GetModuleKernelKeeper(): err=\n\t%w", resKeeper.Err()) return NewErr[IKernelModule](err) } modKernelKeeper := resKeeper.Val() return NewRes(IKernelModule(modKernelKeeper)) } // GetModuleWui -- возвращает модуль для WUI func GetModuleWui() IResult[IKernelModule] { resMod := mod_wui.GetModuleWui() if resMod.IsErr() { err := fmt.Errorf("GetModuleWui(): err=\n\t%w", resMod.Err()) return NewErr[IKernelModule](err) } modWui := resMod.Val() return NewRes(IKernelModule(modWui)) } // NewLogBuf -- возвращает новый буферизованный лог func NewLogBuf(opts ...lev1.OptionLogBuf) ILogBuf { log := lev1.NewLogBuf(opts...) return log } // NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную func NewSafeBoolReact() ISafeBoolReact { val := lev1.NewSafeBoolReact() return val } // NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную func NewSafeInt(val int) ISafeInt { val_ := lev1.NewSafeInt(val) return val_ } // NewInt -- возвращает новую целочисленную переменную func NewInt(val int) Int { val_ := lev1.NewInt(val) return val_ } // NewLocalCtx -- возвращает новый локальный контекст func NewLocalCtx(ctx context.Context) IResult[ILocalCtx] { resCtx := lev1.NewLocalCtx(ctx) if resCtx.IsErr() { err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err()) return NewErr[ILocalCtx](err) } ctx_ := resCtx.Val() return NewRes(ILocalCtx(ctx_)) } // NewSafeString -- возвращает новую потокобезопасную строку func NewSafeString() ISafeString { str := lev1.NewSafeString() return str } // MakeOk -- возвращает новый положительный результат операции func MakeOk[T any](res T) IResult[T] { return NewRes(res) } // MakeErr -- возвращает новую ошибку результат операции func MakeErr[T any](err error) IResult[T] { return NewErr[T](err) } // NewOpt -- возвращает новый не пустой результат операции func NewOpt[T any](some T) IOption[T] { return lev1.NewOpt(some) } // NewNone -- возвращает новый пустой результат операции func NewNone[T any]() IOption[T] { return lev1.NewNone[T]() } // FnHassert -- проверяет с жёстким падением условие type FnHassert = lev1.FnHassert // Hassert -- возвращает ссылку на функцию Hassert func Hassert() FnHassert { return lev1.Hassert() } // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert) type FnAssert = lev1.FnAssert // Assert -- возвращает ссылку на функцию Hassert func Assert() FnAssert { return lev1.Assert() }