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