Bläddra i källkod

SVI Упрощение дженериков под интерфейсы (меньше гемора)

SVI 1 månad sedan
förälder
incheckning
35949a30a5
96 ändrade filer med 1252 tillägg och 1336 borttagningar
  1. 98 25
      README.md
  2. 52 132
      v4/kern.go
  3. 4 4
      v4/kern_test.go
  4. 91 0
      v4/lev0/README.md
  5. 55 9
      v4/lev0/lev0.go
  6. 29 28
      v4/lev0/option/option.go
  7. 20 19
      v4/lev0/option/option_test.go
  8. 30 28
      v4/lev0/result/result.go
  9. 17 15
      v4/lev0/result/result_test.go
  10. 67 0
      v4/lev0/voc/etime/etime.go
  11. 23 0
      v4/lev0/voc/etime/etime_test.go
  12. 2 0
      v4/lev0/voc/vbool/vbool.go
  13. 92 0
      v4/lev0/voc/vmask/vmask.go
  14. 31 0
      v4/lev0/voc/voc.go
  15. 14 16
      v4/lev1/ctx_value/ctx_value.go
  16. 5 6
      v4/lev1/ctx_value/ctx_value_test.go
  17. 3 3
      v4/lev1/kint/kint.go
  18. 1 1
      v4/lev1/kint/kint_test.go
  19. 5 10
      v4/lev1/lev1.go
  20. 21 29
      v4/lev1/local_ctx/local_ctx.go
  21. 14 14
      v4/lev1/local_ctx/local_ctx_test.go
  22. 1 1
      v4/lev1/log_dict_topic/log_dict_topic.go
  23. 10 10
      v4/lev1/log_msg/log_msg.go
  24. 6 6
      v4/lev1/lst_sort/lst_sort_test.go
  25. 4 4
      v4/lev1/safe_bool/safe_bool.go
  26. 3 3
      v4/lev1/safe_bool/safe_bool_test.go
  27. 5 5
      v4/lev1/safe_bool_react/safe_bool_react.go
  28. 3 3
      v4/lev1/safe_bool_react/safe_bool_react_test.go
  29. 5 5
      v4/lev1/safe_int/safe_int.go
  30. 5 5
      v4/lev1/safe_int/safe_int_test.go
  31. 2 2
      v4/lev1/safe_string/safe_string.go
  32. 2 2
      v4/lev1/safe_string/safe_string_test.go
  33. 12 26
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go
  34. 5 8
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go
  35. 6 11
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go
  36. 3 3
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go
  37. 8 30
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go
  38. 4 9
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go
  39. 24 57
      v4/lev2/kbus_base/kbus_base.go
  40. 24 27
      v4/lev2/kbus_base/kbus_base_test.go
  41. 41 51
      v4/lev2/kbus_http/client_bus_http/client_bus_http.go
  42. 24 30
      v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go
  43. 12 31
      v4/lev2/kbus_http/kbus_http.go
  44. 22 22
      v4/lev2/kbus_http/kbus_http_test.go
  45. 3 11
      v4/lev2/kbus_local/client_bus_local/client_bus_local.go
  46. 4 4
      v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go
  47. 8 11
      v4/lev2/kbus_local/kbus_local.go
  48. 5 5
      v4/lev2/kbus_local/kbus_local_test.go
  49. 7 17
      v4/lev2/kctx/kctx.go
  50. 14 14
      v4/lev2/kctx/kctx_test.go
  51. 7 18
      v4/lev2/kernel_keeper/kernel_keeper.go
  52. 1 1
      v4/lev2/kernel_keeper/kernel_keeper_test.go
  53. 6 22
      v4/lev2/kmodule/kmodule.go
  54. 2 2
      v4/lev2/kmodule/kmodule_test.go
  55. 18 45
      v4/lev2/kmonolit/kmonolit.go
  56. 12 17
      v4/lev2/kmonolit/kmonolit_test.go
  57. 10 30
      v4/lev2/kserv_http/kserv_http.go
  58. 10 16
      v4/lev2/kserv_http/kserv_http_test.go
  59. 3 9
      v4/lev2/kserv_http_std/kserv_http_std.go
  60. 13 28
      v4/lev2/kstore_kv/kstore_kv.go
  61. 10 13
      v4/lev2/kstore_kv/kstore_kv_test.go
  62. 2 2
      v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec.go
  63. 5 4
      v4/lev2/kstore_kv_std/kv_bucket_base/kv_bucket_base.go
  64. 12 10
      v4/lev2/kstore_kv_std/rec_meta/rec_meta.go
  65. 2 7
      v4/lev2/kwg/kwg.go
  66. 3 9
      v4/lev2/kwg/kwg_test.go
  67. 2 2
      v4/lev2/log_topic/log_topic.go
  68. 4 4
      v4/lev2/log_topic/log_topic_test.go
  69. 1 1
      v4/lev2/mock_hand_serve/mock_hand_serve.go
  70. 2 2
      v4/lev2/mock_hand_serve/mock_hand_serve_test.go
  71. 3 3
      v4/lev2/mock_hand_sub_http/mock_hand_sub_http_test.go
  72. 6 16
      v4/lev2/wui/wui.go
  73. 8 20
      v4/lev2/wui/wui_button/wui_button.go
  74. 2 2
      v4/lev2/wui/wui_button/wui_button_test.go
  75. 5 17
      v4/lev2/wui/wui_ctx/wui_ctx.go
  76. 3 13
      v4/lev2/wui/wui_label/wui_label.go
  77. 1 1
      v4/lev2/wui/wui_test.go
  78. 1 1
      v4/lev2/wui/wui_types/iwui_button.go
  79. 6 24
      v4/lev3/mod_kctx/mod_kctx.go
  80. 6 6
      v4/lev3/mod_kctx/mod_kctx_test.go
  81. 8 24
      v4/lev3/mod_keeper/mod_keeper.go
  82. 6 6
      v4/lev3/mod_keeper/mod_keeper_test.go
  83. 8 19
      v4/lev3/mod_serv_http/btn_modules/btn_modules.go
  84. 6 6
      v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go
  85. 4 10
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go
  86. 6 6
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go
  87. 6 11
      v4/lev3/mod_serv_http/http_api/http_api.go
  88. 6 6
      v4/lev3/mod_serv_http/http_api/http_api_test.go
  89. 5 17
      v4/lev3/mod_serv_http/mod_serv_http.go
  90. 3 3
      v4/lev3/mod_serv_http/mod_serv_http_test.go
  91. 7 16
      v4/lev3/mod_serv_http/page_module/page_module.go
  92. 19 20
      v4/lev3/mod_serv_http/page_module/page_module_test.go
  93. 26 40
      v4/lev3/mod_serv_http/page_monolit/page_monolit.go
  94. 4 4
      v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go
  95. 14 39
      v4/lev3/mod_wui/mod_wui.go
  96. 12 12
      v4/lev3/mod_wui/mod_wui_test.go

+ 98 - 25
README.md

@@ -2,49 +2,122 @@
 
 **kern v3** -- фреймворк модульных компонентов ядра с высокой надёжностью для любого микросервиса или модульного монолита. Позволяет создавать изолированные модули в составе монолита (полезно в начале разработки). А затем модули можно выносить в отдельные микросервисы (после отладки).
 
-## Контакты
+---
 
-Пишите запросы в соответствующем [разделе](https://gitp78su.ipnodns.ru/svi/kern/issue?status=).
+## 📖 Документация
+
+- [📚 Полный путеводитель по проекту](./v3/docs/index.md)
+- [🔧 Сборка, настройка и запуск](#сборконастройкаизапуск)
+- [🏗️ Архитектура](#архитектура)
+- [📦 Компоненты и модули](#компонентыимодули)
+- [🧪 Тестирование](#тестирование)
+- [🔍 Линтеры](#линтеры)
+
+---
 
-## Статус проекта
+## <a id="сборконастройкаизапуск"></a> 🛠️ Сборка, настройка и запуск
 
-* готовность: `100%` (проект продолжает развиваться);
-* покрытие тестами: `100%`;
-* линтеры: `no errors`;
-* цикломатическая сложность: `< 11`.
+### Требования
 
-## Состав
+- Go 1.24.2 или выше
+- `task` для управления задачами
 
-Команда вывода дерева:
+### Команды сборки
 
 ```bash
-tree -I vendor -I bin_dev -d
+$ task -a
+task: Available tasks for this project:
+* default:       Вывод справки
+* demo:          Запуск демо-проекта
+* lint:          Запуск всех линтеров
+* mod:           Обновление зависимостей
+* test:          Запуск тестов
 ```
 
+### Быстрый старт
+
 ```bash
-TODO: update
+# Сборка
+go build ./...
+
+# Запуск демо
+./demo.sh
+
+# Запуск линтеров
+task lint
 ```
 
-## Версия компилятора
+---
 
-Не ниже `go 1.24.2`
+## <a id="архитектура"></a> 🏗️ Архитектура
+
+kern использует модульную архитектуру, позволяющую бесшовно переходить от модульного монолита к микросервисам.
+
+### Структура проекта
+
+- **Ядро** — базовые компоненты и интерфейсы
+- **Компоненты** — вспомогательные утилиты
+- **Модули** — функциональные блоки
+
+### Подход
 
-## Лицензия
+1. Начните с модульного монолита для быстрого старта
+2. После стабилизации выносите модули в отдельные микросервисы
+3. Документируйте каждый слой с прямыми и обратными ссылками
 
-v1, v2, v3 (код открытый, [лицензия UCL](https://gitp78su.ipnodns.ru/svi/ucl) или `MIT` .)
+---
 
-## Команды сборки
+## <a id="компонентыимодули"></a> 📦 Компоненты и модули
+
+- [Ядро](./v3/docs/index.md#ядро)
+- [Компоненты](./v3/docs/index.md#компоненты)
+- [Модули](./v3/docs/index.md#модули)
+
+[Подробнее →](./v3/docs/index.md)
+
+---
+
+## <a id="тестирование"></a> 🧪 Тестирование
 
 ```bash
-$ task -a
-task: Available tasks for this project:
-* default:       Вывод справки
-* demo:          Запуск демо-проекта
-* lint:          Запуск всех линтеров
-* mod:           Обновление зависимостей
-* test:          Запуск тестов
+task test
+```
+
+Покрытие тестами: 100%
+
+---
+
+## <a id="линтеры"></a> 🔍 Линтеры
+
+```bash
+task lint
 ```
 
-## Документация
+Статус: no errors
+
+---
 
-[Документация](./v3/docs/index.md)
+## <a id="контакты"></a> 👥 Контакты
+
+Пишите запросы в соответствующем [разделе](https://gitp78su.ipnodns.ru/svi/kern/issue?status=).
+
+---
+
+## 📊 Статус проекта
+
+- **Готовность:** 100% (проект продолжает развиваться)
+- **Покрытие тестами:** 100%
+- **Линтеры:** no errors
+- **Цикломатическая сложность:** < 11
+
+---
+
+## 📜 Лицензия
+
+v1, v2, v3 (код открытый, [лицензия UCL](https://gitp78su.ipnodns.ru/svi/ucl) или `MIT`.)
+
+---
+
+## 📦 Версия компилятора
+
+Не ниже `go 1.24.2`

+ 52 - 132
v4/kern.go

@@ -3,7 +3,6 @@ package kern
 
 import (
 	"context"
-	"fmt"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
@@ -25,43 +24,34 @@ import (
 )
 
 // GetKernelCtx -- возвращает контекст ядра.
-func GetKernelCtx() *mL0.Result[mKt.IKernelCtx] {
-	resCtx := kctx.GetKernelCtx()
-	if resCtx.IsErr() {
-		err := fmt.Errorf("GetKernelCtx(): err=\n\t%w", resCtx.Err())
-		return NewErr[mKt.IKernelCtx](err)
-	}
-	return NewRes(mKt.IKernelCtx(resCtx.Val()))
+func GetKernelCtx() mKt.IKernelCtx {
+	ctx := kctx.GetKernelCtx()
+	return ctx
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) *mL0.Result[T] {
+func NewErr[T any](err error) mL0.IResult[T] {
 	return mL0.NewErr[T](err)
 }
 
 // NewRes -- возвращает успешный Result с значением.
-func NewRes[T any](res T) *mL0.Result[T] {
+func NewRes[T any](res T) mL0.IResult[T] {
 	return mL0.NewRes(res)
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res *mL0.Result[T], err error) *mL0.Result[T] {
+func WrapErr[T any](res mL0.IResult[T], err error) mL0.IResult[T] {
 	return mL0.WrapErr(res, err)
 }
 
 // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра.
-func GetKernelStoreKv() *mL0.Result[mKt.IKernelStoreKv] {
-	resStore := kstore_kv.GetKernelStore()
-	if resStore.IsErr() {
-		err := fmt.Errorf("GetKernelStoreKv(): err=\n\t%w", resStore.Err())
-		return NewErr[mKt.IKernelStoreKv](err)
-	}
-	store := mKt.IKernelStoreKv(resStore.Val())
-	return NewRes(store)
+func GetKernelStoreKv() mKt.IKernelStoreKv {
+	store := kstore_kv.GetKernelStore()
+	return store
 }
 
 // GetKernelServerHttp -- возвращает веб-сервер ядра.
-func GetKernelServerHttp() *mL0.Result[mKt.IKernelServerHttp] {
+func GetKernelServerHttp() mKt.IKernelServerHttp {
 	kernServHttp := kserv_http.GetKernelServHttp()
 	return kernServHttp
 }
@@ -73,29 +63,15 @@ func NewSafeBool() mKt.ISafeBool {
 }
 
 // GetKernelBusLocal -- возвращает локальную шину данных.
-func GetKernelBusLocal() *mL0.Result[mKt.IKernelBus] {
-	resCtx := kctx.GetKernelCtx()
-	if resCtx.IsErr() {
-		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resCtx.Err())
-		return NewErr[mKt.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[mKt.IKernelBus](err)
-	}
-	resBus := kbus_local.GetKernelBusLocal()
-	if resBus.IsErr() {
-		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resBus.Err())
-		return NewErr[mKt.IKernelBus](err)
-	}
-	bus := mKt.IKernelBus(resBus.Val())
-	return NewRes(bus)
+func GetKernelBusLocal() mKt.IKernelBus {
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()")
+	lBus := kbus_local.GetKernelBusLocal()
+	return lBus
 }
 
 // GetKernelBusHttp -- возвращает HTTP шину данных.
-func GetKernelBusHttp() *mL0.Result[mKt.IKernelBus] {
+func GetKernelBusHttp() mKt.IKernelBus {
 	bus := kbus_http.GetKernelBusHttp()
 	return bus
 }
@@ -106,128 +82,77 @@ func SleepMs() {
 }
 
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
-func GetMonolitLocal(name string) *mL0.Result[mKt.IKernelMonolit] {
-	resCtx := kctx.GetKernelCtx()
-	if resCtx.IsErr() {
-		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resCtx.Err())
-		return NewErr[mKt.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[mKt.IKernelMonolit](err)
-	}
+func GetMonolitLocal(name string) mKt.IKernelMonolit {
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Set("isLocal", true, "bus type")
 	for {
 		SleepMs()
 		optIsLocal := kCtx.Get("isLocal")
-		if optIsLocal.IsVal() {
+		if optIsLocal.IsSome() {
 			break
 		}
 	}
-	res := kmonolit.GetMonolit(name)
-	if res.IsErr() {
-		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", res.Err())
-		return NewErr[mKt.IKernelMonolit](err)
-	}
+	kMonolit := kmonolit.GetMonolit(name)
 	_ = kbus_local.GetKernelBusLocal()
-	return NewRes(mKt.IKernelMonolit(res.Val()))
+	return kMonolit
 }
 
 // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP.
-func GetMonolitHttp(name string) *mL0.Result[mKt.IKernelMonolit] {
-	resCtx := kctx.GetKernelCtx()
-	if resCtx.IsErr() {
-		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resCtx.Err())
-		return NewErr[mKt.IKernelMonolit](err)
-	}
-	kCtx := resCtx.Val()
+func GetMonolitHttp(name string) mKt.IKernelMonolit {
+	kCtx := kctx.GetKernelCtx()
 	_ = 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[mKt.IKernelMonolit](err)
-	}
+	kCtx.Set("isLocal", false, "bus type")
 	for {
 		SleepMs()
 		optIsLocal := kCtx.Get("isLocal")
-		if optIsLocal.IsVal() {
+		if optIsLocal.IsSome() {
 			break
 		}
 	}
-	res := kmonolit.GetMonolit(name)
-	if res.IsErr() {
-		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", res.Err())
-		return NewErr[mKt.IKernelMonolit](err)
-	}
-	return NewRes(mKt.IKernelMonolit(res.Val()))
+	kMon := kmonolit.GetMonolit(name)
+	return kMon
 }
 
 // NewKernelModule -- возвращает новый модуль на ядре.
-func NewKernelModule(name *mKa.AModuleName) *mL0.Result[mKt.IKernelModule] {
+func NewKernelModule(name *mKa.AModuleName)mKt.IKernelModule {
 	resMod := kmodule.NewKernelModule(name)
 	return resMod
 }
 
 // NewClientBusLocal -- возвращает клиент для работы с локальной шиной.
-func NewClientBusLocal() *mL0.Result[mKt.IBusClient] {
-	res := client_bus_local.NewClientBusLocal()
-	if res.IsErr() {
-		err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", res.Err())
-		return NewErr[mKt.IBusClient](err)
-	}
-	client := res.Val()
-	return NewRes(client)
+func NewClientBusLocal() mKt.IBusClient {
+	lClient := client_bus_local.NewClientBusLocal()
+	return lClient
 }
 
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
-func NewClientBusHttp(url string) *mL0.Result[mKt.IBusClient] {
+func NewClientBusHttp(url string) mKt.IBusClient {
 	client := client_bus_http.NewClientBusHttp(url)
 	return client
 }
 
 // GetModuleServHttp -- возвращает модуль для IKernelServHttp.
-func GetModuleServHttp() *mL0.Result[mKt.IKernelModule] {
-	resHttp := mod_serv_http.GetModuleServHttp()
-	if resHttp.IsErr() {
-		err := fmt.Errorf("GetModuleServHttp(): err=\n\t%w", resHttp.Err())
-		return NewErr[mKt.IKernelModule](err)
-	}
-	modServHttp := resHttp.Val()
-	return NewRes(mKt.IKernelModule(modServHttp))
+func GetModuleServHttp() mKt.IKernelModule {
+	modServHttp := mod_serv_http.GetModuleServHttp()
+	return modServHttp
 }
 
 // GetModuleKernelCtx -- возвращает модуль для IKernelCtx.
-func GetModuleKernelCtx() *mL0.Result[mKt.IKernelModule] {
-	resMod := mod_kctx.GetModuleKernelCtx()
-	if resMod.IsErr() {
-		err := fmt.Errorf("GetModuleKernelCtx(): err=\n\t%w", resMod.Err())
-		return NewErr[mKt.IKernelModule](err)
-	}
-	mod := resMod.Val()
-	return NewRes(mKt.IKernelModule(mod))
+func GetModuleKernelCtx() mKt.IKernelModule {
+	kModCtx := mod_kctx.GetModuleKernelCtx()
+	return kModCtx
 }
 
 // GetModuleKernelKeeper -- возвращает модуль для IKernelKeeper.
-func GetModuleKernelKeeper() *mL0.Result[mKt.IKernelModule] {
-	resKeeper := mod_keeper.GetModuleKeeper()
-	if resKeeper.IsErr() {
-		err := fmt.Errorf("GetModuleKernelKeeper(): err=\n\t%w", resKeeper.Err())
-		return NewErr[mKt.IKernelModule](err)
-	}
-	modKernelKeeper := resKeeper.Val()
-	return NewRes(mKt.IKernelModule(modKernelKeeper))
+func GetModuleKernelKeeper() mKt.IKernelModule {
+	modKernelKeeper := mod_keeper.GetModuleKeeper()
+	return modKernelKeeper
 }
 
 // GetModuleWui -- возвращает модуль для WUI.
-func GetModuleWui() *mL0.Result[mKt.IKernelModule] {
-	resMod := mod_wui.GetModuleWui()
-	if resMod.IsErr() {
-		err := fmt.Errorf("GetModuleWui(): err=\n\t%w", resMod.Err())
-		return NewErr[mKt.IKernelModule](err)
-	}
-	modWui := resMod.Val()
-	return NewRes(mKt.IKernelModule(modWui))
+func GetModuleWui() mKt.IKernelModule {
+	modWui := mod_wui.GetModuleWui()
+	return modWui
 }
 
 // NewLogBuf -- возвращает новый буферизованный лог.
@@ -255,14 +180,9 @@ func NewInt(val int) mKt.Int {
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-func NewLocalCtx(ctx context.Context) *mL0.Result[mKt.ILocalCtx] {
-	resCtx := mL1.NewLocalCtx(ctx)
-	if resCtx.IsErr() {
-		err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
-		return NewErr[mKt.ILocalCtx](err)
-	}
-	ctx_ := resCtx.Val()
-	return NewRes(ctx_)
+func NewLocalCtx(ctx context.Context) mKt.ILocalCtx {
+	lCtx := mL1.NewLocalCtx(ctx)
+	return lCtx
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку.
@@ -272,22 +192,22 @@ func NewSafeString() mKt.ISafeString {
 }
 
 // MakeOk -- возвращает новый положительный результат операции.
-func MakeOk[T any](res T) *mL0.Result[T] {
+func MakeOk[T any](res T) mL0.IResult[T] {
 	return NewRes(res)
 }
 
 // MakeErr -- возвращает новую ошибку результат операции.
-func MakeErr[T any](err error) *mL0.Result[T] {
+func MakeErr[T any](err error) mL0.IResult[T] {
 	return NewErr[T](err)
 }
 
 // NewOpt -- возвращает новый не пустой результат операции.
-func NewOpt[T any](some T) *mL0.Option[T] {
+func NewOpt[T any](some T) mL0.IOption[T] {
 	return mL0.NewOpt(some)
 }
 
 // NewNone -- возвращает новый пустой результат операции.
-func NewNone[T any]() *mL0.Option[T] {
+func NewNone[T any]() mL0.IOption[T] {
 	return mL0.NewNone[T]()
 }
 

+ 4 - 4
v4/kern_test.go

@@ -40,7 +40,7 @@ func TestBuilders(t *testing.T) {
 // создание компонентов.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	ctx := GetKernelCtx().Hassert("new()")
+	ctx := GetKernelCtx()
 	if ctx == nil {
 		sf.t.Fatalf("new(): IKernelCtx==nil")
 	}
@@ -59,7 +59,7 @@ func (sf *tester) new() {
 		sf.t.Fatalf("new(): cal(%v)!=28", val)
 	}
 
-	kernServHttp := GetKernelServerHttp().Hassert("new()")
+	kernServHttp := GetKernelServerHttp()
 	go kernServHttp.Run()
 	ctx.Cancel()
 	ctx.Wg().Wait()
@@ -85,7 +85,7 @@ func (sf *tester) new3() {
 }
 
 func (sf *tester) new2() {
-	ctx := GetKernelCtx().Hassert("new()")
+	ctx := GetKernelCtx()
 	if ctx == nil {
 		sf.t.Fatalf("new(): IKernelCtx==nil")
 	}
@@ -152,7 +152,7 @@ func (sf *tester) new1() {
 }
 
 func (sf *tester) new0() {
-	store := GetKernelStoreKv().Hassert("new()")
+	store := GetKernelStoreKv()
 	res := store.Delete("test_builders")
 	if res.IsErr() {
 		sf.t.Fatalf("new0(): get empty key, store, err=%v", res.Err())

+ 91 - 0
v4/lev0/README.md

@@ -0,0 +1,91 @@
+# lev0 — Уровень 0: Базовые компоненты
+
+Уровень 0 содержит базовые компоненты и утилиты для работы с:
+- **Алиасами** — пользовательские типы для усиления типизации
+- **Помощниками** — полезные утилиты
+- **Типами** — интерфейсы и типы ядра
+- **Опциями** — паттерн опции
+- **Результатами** — тип Result для операций
+- **Процессами** — процесс-ориентированный стиль
+- **Типизацией значений** — типы значений (bool, int, string, float, byte)
+- **Валидации** — система валидации значений
+- **Времени** — работа с метками времени
+
+---
+
+## 📦 Структура
+
+### Алиасы
+
+- [alias.go](./alias/alias.go) — алиасные типы
+- [handler_name.go](./alias/handler_name/handler_name.go) — имя обработчика
+- [module_name.go](./alias/module_name/module_name.go) — имя модуля
+- [store_key.go](./alias/store_key/store_key.go) — ключ хранилища
+- [stream_name.go](./alias/stream_name/stream_name.go) — имя потока
+- [topic.go](./alias/topic/topic.go) — имя топика
+
+### Помощники
+
+- [helpers.go](./helpers/helpers.go) — полезные утилиты
+
+### Типы
+
+- [lev0.go](./lev0.go) — основной файл уровня
+- [ibucket_base.go](./ktypes/ibucket_base.go) — базовый интерфейс бамкета
+- [idict_kv.go](./ktypes/idict_kv.go) — интерфейс key-value
+- [ikernel_bus.go](./ktypes/ikernel_bus.go) — шина ядра
+- [ikernel_ctx.go](./ktypes/ikernel_ctx.go) — контекст ядра
+- [ikernel_int.go](./ktypes/ikernel_int.go) — счётчик ядра
+- [ikernel_keeper.go](./ktypes/ikernel_keeper.go) — сторож ядра
+- [ikernel_module.go](./ktypes/ikernel_module.go) — модуль ядра
+- [ikernel_monolit.go](./ktypes/ikernel_monolit.go) — монолит
+- [ikernel_server_http.go](./ktypes/ikernel_server_http.go) — HTTP-сервер
+- [ikernel_store_kv.go](./ktypes/ikernel_store_kv.go) — хранилище
+- [ikernel_wg.go](./ktypes/ikernel_wg.go) — waiting group
+- [ilocal_ctx.go](./ktypes/ilocal_ctx.go) — локальный контекст
+- [ilog_buf.go](./ktypes/ilog_buf.go) — буфер логирования
+- [imodule_stat.go](./ktypes/imodule_stat.go) — статистика модуля
+- [irec_kv.go](./ktypes/irec_kv.go) — запись key-value
+- [irec_meta.go](./ktypes/irec_meta.go) — метазапись
+- [irec_val.go](./ktypes/irec_val.go) — значение записи
+- [irw_mutex.go](./ktypes/irw_mutex.go) — мьютекс
+- [isafe_bool.go](./ktypes/isafe_bool.go) — безопасный bool
+- [isafe_bool_react.go](./ktypes/isafe_bool_react.go) — реактивный bool
+- [isafe_int.go](./ktypes/isafe_int.go) — безопасный int
+- [isafe_string.go](./ktypes/isafe_string.go) — безопасная строка
+- [itime.go](./ktypes/itime.go) — метка времени
+
+### Опции
+
+- [option.go](./option/option.go) — паттерн опции
+
+### Процессы
+
+- [proton.go](./proton/neutron.go) — процесс
+
+### Результатов
+
+- [result.go](./result/result.go) — тип Result
+
+### Валидация значений
+
+- [vbool.go](./voc/vbool/vbool.go) — валидация bool
+- [vmask.go](./voc/vmask/vmask.go) — маска валидации
+- [voc.go](./voc/voc.go) — валидация
+- [vtime.go](./voc/vtime/vtime.go) — валидация времени
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ядра → lev0](/v4/docs/index.md#ядро)
+- [Из компонентов → lev0](/v4/docs/index.md#компоненты)
+- [Из модулей → lev0](/v4/docs/index.md#модули)
+
+---
+
+## 🔄 Обратные связи
+
+- [lev0 → Компоненты](#помощники)
+- [lev0 → Типы](#типы)
+- [lev0 → Алиасы](#алиасы)

+ 55 - 9
v4/lev0/lev0.go

@@ -2,39 +2,85 @@
 package lev0
 
 import (
+	mEt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
 	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
+// SleepMs -- задержка в миллисекундах.
+func SleepMs() {
+	helpers.SleepMs()
+}
+
+// EStr -- расширенная строка.
+type EStr = mKt.EStr
+
+// EStrMut -- расширенная строка с признаком мутабельности.
+type EStrMut = mKt.EStrMut
+
+// FnOptStr -- опция для установки параметров расширенной строки.
+type FnOptStr = mEt.FnOptStr
+
+// OptStr -- устанавливает начальное значение строки.
+func OptStr(val string) FnOptStr {
+	return mEt.OptStr(val)
+}
+
+// OptStrMut -- устанавливает признак мутабельности.
+func OptStrMut() FnOptStr {
+	return mEt.OptStrMut()
+}
+
+// OptStrMinLen -- устанавливает минимальную длину строки.
+func OptStrMinLen(lenMin int) FnOptStr {
+	return mEt.OptStrMinLen(lenMin)
+}
+
+// OptStrMaxLen -- устанавливает максимальную длину строки.
+func OptStrMaxLen(lenMax int) FnOptStr {
+	return mEt.OptStrMaxLen(lenMax)
+}
+
+// StrNew -- возвращает новую строку KStr.
+func StrNew(opt ...FnOptStr) EStr {
+	return mEt.StrNew(opt...)
+}
+
+// StrMutNew -- возвращает новую строку KStrMut.
+func StrMutNew(opt ...FnOptStr) EStrMut {
+	return mEt.StrMutNew(opt...)
+}
+
 // Result — обёртка вокруг результата с возможной ошибкой.
-type Result[T any] = mRes.Result[T]
+type IResult[T any] = mKt.IResult[T]
 
 // NewRes -- возвращает успешный Result с значением.
-func NewRes[T any](res T) *Result[T] {
+func NewRes[T any](res T) IResult[T] {
 	return mRes.NewRes(res)
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) *Result[T] {
+func NewErr[T any](err error) IResult[T] {
 	return mRes.NewErr[T](err)
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res *Result[T], err error) *Result[T] {
+func WrapErr[T any](res IResult[T], err error) IResult[T] {
 	return mRes.WrapErr(res, err)
 }
 
-// Option — обёртка вокруг результата с возможной пустотой.
-type Option[T any] = option.Option[T]
+// IOption — обёртка вокруг результата с возможной пустотой.
+type IOption[T any] = mKt.IOption[T]
 
 // NewOpt -- возвращает новый не пустой результат операции.
-func NewOpt[T any](some T) *Option[T] {
-	return option.NewOpt(some)
+func NewOpt[T any](some T) IOption[T] {
+	return IOption[T](option.NewSome(some))
 }
 
 // NewNone -- возвращает новый пустой результат операции.
-func NewNone[T any]() *option.Option[T] {
+func NewNone[T any]() IOption[T] {
 	return option.NewNone[T]()
 }
 

+ 29 - 28
v4/lev0/option/option.go

@@ -4,73 +4,74 @@ import (
 	"reflect"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 // Option -- результат возможно содержащий nil.
 type Option[T any] struct {
-	val *T
+	some *T
 }
 
-// NewOpt - полезный результат.
-func NewOpt[T any](value T) *Option[T] {
+// NewSome - полезный результат.
+func NewSome[T any](value T) mKt.IOption[T] {
 	// Для некоторых типов нужна дополнительная проверка через reflect
 	v := reflect.ValueOf(value)
 	switch v.Kind() {
 	case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
 		Hassert(!v.IsNil(), "NewSome[T any](): value==nil")
 	}
-	sf := &Option[T]{val: &value}
+	sf := &Option[T]{some: &value}
 	return sf
 }
 
 // NewNone - нет результата в ответе.
-func NewNone[T any]() *Option[T] {
+func NewNone[T any]() mKt.IOption[T] {
 	return &Option[T]{
-		val: nil,
+		some: nil,
 	}
 }
 
-// IsVal - проверяет, есть ли значение.
-func (sf *Option[T]) IsVal() bool {
-	return sf.val != nil
+// IsSome - проверяет, есть ли значение.
+func (sf *Option[T]) IsSome() bool {
+	return sf.some != nil
 }
 
-// IsSome - проверяет, есть ли значение.
+// IsNone - проверяет, есть ли значение.
 func (sf *Option[T]) IsNone() bool {
-	return sf.val == nil
+	return sf.some == nil
 }
 
-// Val - извлекает значение (паника, если None).
-func (sf *Option[T]) Val() T {
-	Hassert(sf.val != nil, "Option[T].Val(): val==nil!")
-	return *sf.val
+// Some - извлекает значение (паника, если None).
+func (sf *Option[T]) Some() T {
+	Hassert(sf.some != nil, "Option[T].Some(): val==nil!")
+	return *sf.some
 }
 
-// ValOr - возвращает значение или дефолтное.
-func (sf Option[T]) ValOr(defaultValue T) T {
-	if sf.val == nil {
+// SomeOr - возвращает значение или дефолтное.
+func (sf Option[T]) SomeOr(defaultValue T) T {
+	if sf.some == nil {
 		return defaultValue
 	}
-	return *sf.val
+	return *sf.some
 }
 
-// ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
-func (sf *Option[T]) ValOrFn(fn func() T) T {
-	Hassert(fn != nil, "Result[T].UnwrapOrFn(): fn==nil")
-	if sf.val == nil {
+// SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
+func (sf *Option[T]) SomeOrFn(fn func() T) T {
+	Hassert(fn != nil, "Option[T].SomeOrFn(): fn==nil")
+	if sf.some == nil {
 		return fn()
 	}
-	return *sf.val
+	return *sf.some
 }
 
 // Hassert -- проверяет, что не пустое значение (с паникой).
 func (sf *Option[T]) Hassert(msgFormat string, args ...any) T {
-	Hassert(sf.val != nil, msgFormat, args...)
-	return *sf.val
+	Hassert(sf.some != nil, msgFormat, args...)
+	return *sf.some
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
 func (sf *Option[T]) Assert(msgFormat string, args ...any) T {
-	Assert(sf.val != nil, msgFormat, args...)
-	return *sf.val
+	Assert(sf.some != nil, msgFormat, args...)
+	return *sf.some
 }

+ 20 - 19
v4/lev0/option/option_test.go

@@ -32,24 +32,25 @@ func (sf *testerOption) createNoneGood1() {
 		}
 	}()
 	opt := NewNone[string]()
-	if opt.IsVal() {
+	if opt.IsSome() {
 		sf.t.Fatalf("createNoneGood1(): is ok")
 	}
 	if !opt.IsNone() {
 		sf.t.Fatalf("createNoneGood1(): not err")
 	}
-	if val := opt.ValOr("test2"); val != "test2" {
+	if val := opt.SomeOr("test2"); val != "test2" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.ValOr("test1"); val != "test1" {
+	if val := opt.SomeOr("test1"); val != "test1" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.ValOrFn(sf.fnWrap2); val != "test5" {
+	if val := opt.SomeOrFn(sf.fnWrap2); val != "test5" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	sf.unwrapErr(opt)
-	sf.hassert(opt)
-	sf.assert(opt)
+	_opt:=opt.(*Option[string])
+	sf.unwrapErr(_opt)
+	sf.hassert(_opt)
+	sf.assert(_opt)
 }
 
 func (sf *testerOption) assert(res *Option[string]) {
@@ -79,7 +80,7 @@ func (sf *testerOption) unwrapErr(res *Option[string]) {
 			sf.t.Fatalf("unwrapErr(): panic==nil")
 		}
 	}()
-	_ = res.Val()
+	_ = res.Some()
 }
 
 const (
@@ -93,27 +94,27 @@ func (sf *testerOption) createSomeGood2() {
 			sf.t.Fatalf("createSomeGood2(): panic=%v", _panic)
 		}
 	}()
-	res := NewOpt(str)
-	if !res.IsVal() {
+	opt := NewSome(str)
+	if !opt.IsSome() {
 		sf.t.Fatalf("createSomeGood1(): not ok")
 	}
-	if res.IsNone() {
+	if opt.IsNone() {
 		sf.t.Fatalf("createSomeGood1(): is err")
 	}
-	if val := res.Val(); val != str {
+	if val := opt.Some(); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != str {
+	if val := opt.SomeOr("test1"); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != "str" {
+	if val := opt.SomeOr("test1"); val != "str" {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := res.ValOrFn(sf.fnWrap); val != str {
+	if val := opt.SomeOrFn(sf.fnWrap); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	res.Hassert("test")
-	res.Assert("test")
+	opt.Hassert("test")
+	opt.Assert("test")
 }
 
 // Функция высшего порядка для замещения ошибки.
@@ -134,7 +135,7 @@ func (sf *testerOption) createSomeGood1() {
 		}
 	}()
 	str := "test val"
-	_ = NewOpt(&str)
+	_ = NewSome(&str)
 }
 
 // Нет результата.
@@ -146,5 +147,5 @@ func (sf *testerOption) createSomeBad1() {
 		}
 	}()
 	var str *string
-	_ = NewOpt(str)
+	_ = NewSome(str)
 }

+ 30 - 28
v4/lev0/result/result.go

@@ -6,6 +6,7 @@ import (
 	"runtime"
 
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 // Result — обёртка вокруг результата с возможной ошибкой.
@@ -13,13 +14,12 @@ import (
 // Может быть либо только полезное значение, либо только ошибка.
 type Result[T any] struct {
 	val     T     // Полезное значение
-	isErr   bool  // Если содержит ошибку
 	isCheck bool  // Если проверено
 	err     error // Ошибка
 }
 
 // NewRes -- возвращает успешный Result с значением.
-func NewRes[T any](result T) *Result[T] {
+func NewRes[T any](result T) mKt.IResult[T] {
 	// Для некоторых типов нужна дополнительная проверка через reflect
 	v := reflect.ValueOf(result)
 	switch v.Kind() {
@@ -34,18 +34,17 @@ func NewRes[T any](result T) *Result[T] {
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) *Result[T] {
+func NewErr[T any](err error) mKt.IResult[T] {
 	mKh.Hassert(err != nil, "NewError(): err==nil")
 	sf := &Result[T]{
-		err:   err,
-		isErr: true,
+		err: err,
 	}
 	runtime.SetFinalizer(sf, sf.destroy)
 	return sf
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res *Result[T], err error) *Result[T] {
+func WrapErr[T any](res mKt.IResult[T], err error) mKt.IResult[T] {
 	mKh.Hassert(res.IsErr(), "WrapErr(): result not have error")
 	mKh.Hassert(err != nil, "WrapErr(): err==nil")
 	err0 := res.Err() // Чтобы не было паники при финализации и обернуть ошибку
@@ -63,50 +62,53 @@ func (sf *Result[T]) destroy(res *Result[T]) {
 // IsOk -- возвращает true, если Result содержит значение.
 func (sf *Result[T]) IsOk() bool {
 	sf.isCheck = true
-	return !sf.isErr
+	return sf.err == nil
 }
 
 // IsErr -- возвращает true, если Result содержит ошибку.
 func (sf *Result[T]) IsErr() bool {
 	sf.isCheck = true
-	return sf.isErr
+	return sf.err != nil
 }
 
-// Val -- возвращает значение, если оно есть, иначе паникует.
-func (sf *Result[T]) Val() T {
-	mKh.Hassert(!sf.isErr, "Result[T].Val(): err(%v)!=nil", sf.err)
+// Ok -- возвращает значение, если оно есть, иначе паникует.
+func (sf *Result[T]) Ok() T {
+	mKh.Hassert(sf.err == nil, "Result[T].Ok(): err(%v)!=nil", sf.err.Error())
+	sf.isCheck = true
 	return sf.val
 }
 
-// ValOr -- возвращает значение, если оно есть, или значение по умолчанию.
-func (sf *Result[T]) ValOr(defaultValue T) T {
+// OkOr -- возвращает значение, если оно есть, или значение по умолчанию.
+func (sf *Result[T]) OkOr(defaultValue T) T {
 	sf.isCheck = true
-	if sf.isErr {
-		return defaultValue
+	if sf.err != nil {
+		sf.val = defaultValue
+		sf.err = nil
 	}
-	return sf.val
+	return sf.Ok()
 }
 
-// ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
-func (sf *Result[T]) ValOrFn(fn func() T) T {
-	mKh.Hassert(fn != nil, "Result[T].ValOrFn(): fn==nil")
+// OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
+func (sf *Result[T]) OkOrFn(fn func() T) T {
+	mKh.Hassert(fn != nil, "Result[T].OkOrFn(): fn==nil")
 	sf.isCheck = true
-	if sf.isErr {
-		return fn()
+	if sf.err != nil {
+		sf.val = fn()
+		sf.err = nil
 	}
-	return sf.val
+	return sf.Ok()
 }
 
 // Err -- возвращает ошибку, если она есть.
 func (sf *Result[T]) Err() error {
-	mKh.Hassert(sf.isErr, "Result[T].Err(): err==nil")
+	mKh.Hassert(sf.err != nil, "Result[T].Err(): err==nil")
 	sf.isCheck = true
 	return sf.err
 }
 
 // Error -- возвращает строковое представление ошибки, если она есть.
 func (sf *Result[T]) Error() string {
-	mKh.Hassert(sf.isErr, "Result[T].Error(): err==nil")
+	mKh.Hassert(sf.err != nil, "Result[T].Error(): err==nil")
 	sf.isCheck = true
 	return sf.err.Error()
 }
@@ -114,11 +116,11 @@ func (sf *Result[T]) Error() string {
 // Hassert -- проверяет, что нет ошибки (с паникой).
 func (sf *Result[T]) Hassert(msgFormat string, args ...any) T {
 	strErr := ""
-	if sf.isErr {
+	if !sf.isCheck {
 		strErr = fmt.Sprintf(", err=\n\t%v", sf.err)
 	}
 	msg := fmt.Sprintf(msgFormat+strErr, args...)
-	mKh.Hassert(!sf.isErr, msg)
+	mKh.Hassert(sf.err == nil, msg)
 	sf.isCheck = true
 	return sf.val
 }
@@ -126,11 +128,11 @@ func (sf *Result[T]) Hassert(msgFormat string, args ...any) T {
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
 func (sf *Result[T]) Assert(msgFormat string, args ...any) T {
 	strErr := ""
-	if sf.isErr {
+	if !sf.isCheck {
 		strErr = fmt.Sprintf(", err=\n\t%v", sf.err)
 	}
 	msg := fmt.Sprintf(msgFormat+strErr, args...)
-	mKh.Assert(!sf.isErr, msg)
+	mKh.Assert(sf.err == nil, msg)
 	sf.isCheck = true
 	return sf.val
 }

+ 17 - 15
v4/lev0/result/result_test.go

@@ -4,7 +4,8 @@ import (
 	"fmt"
 	"runtime"
 	"testing"
-	// . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {
@@ -30,14 +31,15 @@ func (sf *tester) notCheck() {
 	}()
 	res := NewRes("test")
 	{
-		val := res.Val()
+		val := res.Ok()
 		if val != "test" {
 			sf.t.Fatalf("notCheck() test!=test")
 		}
 	}
 	runtime.Gosched()
 	runtime.GC()
-	res.destroy(res)
+	_res:=res.(*Result[string])
+	_res.destroy(_res)
 }
 
 // Создаёт новый Result.
@@ -65,13 +67,13 @@ func (sf *tester) createErrGood1() {
 	if !res.IsErr() {
 		sf.t.Fatalf("createErrGood1(): not err")
 	}
-	if val := res.ValOr("test2"); val != "test2" {
+	if val := res.OkOr("test2"); val != "test2" {
 		sf.t.Fatalf("createErrGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != "test1" {
+	if val := res.OkOr("test1"); val != "test1" {
 		sf.t.Fatalf("createErrGood1(): val bad")
 	}
-	if val := res.ValOrFn(sf.fnWrap2); val != "test5" {
+	if val := res.OkOrFn(sf.fnWrap2); val != "test5" {
 		sf.t.Fatalf("createErrGood1(): val bad")
 	}
 	if err := res.Err(); err == nil {
@@ -86,7 +88,7 @@ func (sf *tester) createErrGood1() {
 	}
 	{
 		res := NewRes("test_ok")
-		if val := res.ValOr("test_ok1"); val != "test_ok" {
+		if val := res.OkOr("test_ok1"); val != "test_ok" {
 			sf.t.Fatalf("createErrGood1(): val(%v) != 'test_ok'", val)
 		}
 	}
@@ -108,7 +110,7 @@ func (sf *tester) assert2() {
 	res.Assert("test assert2")
 }
 
-func (sf *tester) hassert2(res *Result[string]) {
+func (sf *tester) hassert2(res mKt.IResult[string]) {
 	sf.t.Log("hassert2")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -118,7 +120,7 @@ func (sf *tester) hassert2(res *Result[string]) {
 	res.Hassert("test hassert2")
 }
 
-func (sf *tester) hassert(res *Result[string]) {
+func (sf *tester) hassert(res mKt.IResult[string]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -128,14 +130,14 @@ func (sf *tester) hassert(res *Result[string]) {
 	res.Hassert("test hassert")
 }
 
-func (sf *tester) unwrapErr(res *Result[string]) {
+func (sf *tester) unwrapErr(res mKt.IResult[string]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {
 			sf.t.Fatalf("unwrapErr(): panic==nil")
 		}
 	}()
-	_ = res.Val()
+	_ = res.Ok()
 }
 
 // Нет ошибки.
@@ -168,16 +170,16 @@ func (sf *tester) createOkGood2() {
 	if res.IsErr() {
 		sf.t.Fatalf("createOkGood1(): is err")
 	}
-	if val := res.Val(); val != str {
+	if val := res.Ok(); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != str {
+	if val := res.OkOr("test1"); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != str {
+	if val := res.OkOr("test1"); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	if val := res.ValOrFn(sf.fnWrap); val != str {
+	if val := res.OkOrFn(sf.fnWrap); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
 	res0 := NewErr[any](fmt.Errorf("test_error"))

+ 67 - 0
v4/lev0/voc/etime/etime.go

@@ -0,0 +1,67 @@
+package etime
+
+import (
+	"time"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+)
+
+// ETime -- метка времени.
+// Вывод: "2006-01-02 15:04:05.000 -07 MST".
+type ETime struct {
+	val    alias.ATime
+	isMut  bool // Мутабельность
+	isFill bool // Признак заполнения
+}
+
+// NewETime -- создает новый экземпляр ETime.
+func NewETime(val alias.ATime) mKt.ITime {
+	helpers.Hassert(val != "", "NewETime(): val is empty")
+	sf := &ETime{
+		val:    val,
+		isFill: true,
+	}
+	return sf
+}
+
+// NewETimeAuto -- создаёт фиксированную авто-метку времени.
+func NewETimeAuto() mKt.ITime {
+	sf := &ETime{
+		isFill: true,
+	}
+	val := time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
+	sf.Set(alias.ATime(val))
+	return sf
+}
+
+// NewETimeAutoMut -- создаёт изменяемую авто-метку времени.
+func NewETimeAutoMut() mKt.ITimeMut {
+	sf := &ETime{
+		isFill: true,
+		isMut:  true,
+	}
+	val := time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
+	sf.Set(alias.ATime(val))
+	return sf
+}
+
+// String -- возвращает строку.
+func (sf *ETime) String() string {
+	helpers.Hassert(sf.val != "", "ETime.String(): значение не инициализировано")
+	return string(sf.val)
+}
+
+// Get -- возвращает строку.
+func (sf *ETime) Get() alias.ATime {
+	helpers.Hassert(sf.val != "", "ETime.Get(): значение не инициализировано")
+	return sf.val
+}
+
+// Set -- устанавливает значение.
+func (sf *ETime) Set(val alias.ATime) {
+	helpers.Hassert(sf.isMut, "ETime.Set(): значение фиксировано")
+	helpers.Hassert(val != "", "ETime.Set(): val is empty")
+	sf.val = val
+}

+ 23 - 0
v4/lev0/voc/etime/etime_test.go

@@ -0,0 +1,23 @@
+package etime
+
+import (
+	"testing"
+)
+
+type testTime struct {
+	t *testing.T
+}
+
+func TestATime(t *testing.T) {
+	sf := &testTime{
+		t: t,
+	}
+	sf.get()
+}
+
+// Получение времени.
+func (t *testTime) get() {
+	a := NewETime("123")
+	_ = a.String()
+	_ = a.Get()
+}

+ 2 - 0
v4/lev0/voc/vbool/vbool.go

@@ -0,0 +1,2 @@
+// package vbool -- тип булева с маской признаков
+package vbool

+ 92 - 0
v4/lev0/voc/vmask/vmask.go

@@ -0,0 +1,92 @@
+// package vmask -- набор масок для защиты "снизу"
+package vmask
+
+import (
+	"encoding/json"
+)
+
+// AMask -- маска значения-объекта
+type AMask byte
+
+// Mask -- маска для защиты "снизу"
+type Mask struct {
+	Val AMask // `json:"mask"` Набор признаков.
+}
+
+// VMask -- обёртка маски для защиты "снизу"
+type VMask struct {
+	val Mask // Набор признаков.
+}
+
+const (
+	CanMut     = AMask(0) // Признак мутабельности значения
+	CanDefault = AMask(1) // Признак значения по умолчанию
+	IsAuto     = AMask(2) // Признак авто-инициализации
+)
+
+// NewVMask -- создать маску для защиты "снизу"
+func NewVMask(mask AMask) VMask {
+	sf := VMask{
+		val: Mask{
+			Val: mask,
+		},
+	}
+	return sf
+}
+
+// IsAuto -- возвращает признак авто-инициализации
+func (sf *VMask) IsAuto() bool {
+	return sf.val.Val&IsAuto != 0
+}
+
+// CanDefault -- возвращает признак значения по умолчанию
+func (sf *VMask) CanDefault() bool {
+	return sf.val.Val&CanDefault != 0
+}
+
+// CanMut -- возвращает признак мутабельности
+func (sf *VMask) CanMut() bool {
+	return sf.val.Val&CanMut != 0
+}
+
+// Get -- возвращает маску значения
+func (sf *VMask) Get() AMask {
+	return sf.val.Val
+}
+
+// MarshalJSON -- реализация интерфейса Marshaler
+func (sf *VMask) MarshalJSON() ([]byte, error) {
+	// Возвращаем кастомную строку JSON
+	return json.Marshal(sf.val)
+}
+
+// UnmarshalJSON -- реализация интерфейса Unmarshaler
+func (sf *VMask) UnmarshalJSON(binData []byte) error {
+	var mask Mask
+	if err := json.Unmarshal(binData, &mask); err != nil {
+		return err
+	}
+	sf.val = mask
+	return nil
+}
+
+// String -- строковое представление маски
+func (sf *VMask) String() string {
+	out := ""
+	if sf.CanMut() {
+		out += "CanMut"
+	}
+	if sf.CanDefault() {
+		if len(out) > 0 {
+			out += "|"
+		}
+		out += "CanDefault"
+	}
+	if sf.IsAuto() {
+		if len(out) > 0 {
+			out += "|"
+		}
+		out += "IsAuto"
+	}
+	return "[" + out + "]"
+}

+ 31 - 0
v4/lev0/voc/voc.go

@@ -0,0 +1,31 @@
+// package voc -- value-objects core
+package voc
+
+import (
+	mKt 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
+
+)
+
+// NewETime -- создать новую метку времени.
+//
+//go:fix inline
+func NewETime(val alias.ATime) mKt.ITime {
+	return etime.NewETime(val)
+}
+
+// NewETimeAuto -- создать новую фиксированную авто-метку
+//
+//go:fix inline
+func NewETimeAuto() mKt.ITime {
+	return etime.NewETimeAuto()
+}
+
+
+// NewETimeAutoMut -- создать новую фиксированную авто-метку
+//
+//go:fix inline
+func NewETimeAutoMut() mKt.ITimeMut {
+	return etime.NewETimeAutoMut()
+}

+ 14 - 16
v4/lev1/ctx_value/ctx_value.go

@@ -2,36 +2,34 @@
 package ctx_value
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc"
 )
 
 // CtxValue -- потокобезопасное значение локального контекста.
 type CtxValue struct {
 	sync.RWMutex
 	key       string
-	createAt  *alias.ATime
+	createAt  mKt.ITime
 	Val_      any
-	UpdateAt_ *alias.ATime
+	UpdateAt_ mKt.ITimeMut
 	Comment_  string
 }
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
-func NewCtxValue(key string, val any, comment string) *mL0.Result[*CtxValue] {
-	if key == "" {
-		err := fmt.Errorf("NewCtxValue(): key is empty")
-		return mL0.NewErr[*CtxValue](err)
-	}
+func NewCtxValue(key string, val any, comment string) mKt.ICtxValue {
+	mL0.Hassert(key!="", "NewCtxValue(): key is empty")
 	sf := &CtxValue{
-		key:      key,
-		createAt: alias.NewATime(),
-		Val_:     val,
-		Comment_: comment,
+		key:       key,
+		createAt:  voc.NewETimeAuto(),
+		UpdateAt_: voc.NewETimeAutoMut(),
+		Val_:      val,
+		Comment_:  comment,
 	}
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Key -- возвращает ключ значения.
@@ -47,14 +45,14 @@ func (sf *CtxValue) Val() any {
 }
 
 // UpdateAt -- возвращает время обновления значения.
-func (sf *CtxValue) UpdateAt() *alias.ATime {
+func (sf *CtxValue) UpdateAt() mKt.ITimeMut {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.UpdateAt_
 }
 
 // CreateAt -- возвращает время создания значения.
-func (sf *CtxValue) CreateAt() *alias.ATime {
+func (sf *CtxValue) CreateAt() mKt.ITime {
 	return sf.createAt
 }
 

+ 5 - 6
v4/lev1/ctx_value/ctx_value_test.go

@@ -3,14 +3,13 @@ package ctx_value
 import (
 	"testing"
 
-	alias "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {
-	t      *testing.T
-	val    ICtxValue
-	create *alias.ATime
+	t         *testing.T
+	val       ICtxValue
+	createdAt ITime
 }
 
 func TestCtxValue(t *testing.T) {
@@ -23,7 +22,7 @@ func TestCtxValue(t *testing.T) {
 // Создаёт значение локального контекста.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.val = NewCtxValue("test_key", 5, "test_value").Hassert("new()")
+	sf.val = NewCtxValue("test_key", 5, "test_value")
 	if sf.val == nil {
 		sf.t.Fatalf("new(): val==nil")
 	}
@@ -34,7 +33,7 @@ func (sf *tester) new() {
 	if create.Get() == "" {
 		sf.t.Fatalf("new(): create is empty")
 	}
-	sf.create = create
+	sf.createdAt = create
 	if comment := sf.val.Comment(); comment != "test_value" {
 		sf.t.Fatalf("new(): comment(%v)!='test_value'", comment)
 	}

+ 3 - 3
v4/lev1/kint/kint.go

@@ -51,7 +51,7 @@ func (sf *KernInt) Reset() {
 }
 
 // FromStr -- устанавливает значение из строки.
-func (sf *KernInt) FromStr(strVal string) *mL0.Result[int] {
+func (sf *KernInt) FromStr(strVal string) mL0.IResult[int] {
 	iVal, err := strconv.Atoi(strVal)
 	if err != nil {
 		return mL0.NewErr[int](fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err))
@@ -66,7 +66,7 @@ func (sf *KernInt) ToStr() string {
 }
 
 // FromByte -- устанавливает значение из байтов (BigEndian, net order).
-func (sf *KernInt) FromByte(binData []byte) *mL0.Result[int] {
+func (sf *KernInt) FromByte(binData []byte) mL0.IResult[int] {
 	lenBin := len(binData)
 	if lenBin < 8 {
 		return mL0.NewErr[int](fmt.Errorf("KInt.FromByte(): len(%v) bytes shorts", lenBin))
@@ -104,7 +104,7 @@ func (sf *KernInt) ToBool() bool {
 }
 
 // Getenv -- устанавливает значение из окружения.
-func (sf *KernInt) Getenv(env string) *mL0.Result[int] {
+func (sf *KernInt) Getenv(env string) mL0.IResult[int] {
 	strVal := os.Getenv(env)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {

+ 1 - 1
v4/lev1/kint/kint_test.go

@@ -37,7 +37,7 @@ func (sf *tester) new3(val Int) {
 	_ = os.Setenv("TEST_VAL", "57")
 	resInt := val.Getenv("TEST_VAL")
 	resInt.Hassert("get env")
-	if resInt.Val() != 57 {
+	if resInt.Ok() != 57 {
 		sf.t.Fatalf("new(): isVal==true")
 	}
 

+ 5 - 10
v4/lev1/lev1.go

@@ -3,7 +3,6 @@ package lev1
 
 import (
 	"context"
-	"fmt"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -53,12 +52,12 @@ func NewSafeString() mKt.ISafeString {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(strVal string) *mL0.Result[mKt.ISafeInt] {
+func NewSafeIntFromStr(strVal string) mL0.IResult[mKt.ISafeInt] {
 	return safe_int.NewSafeIntFromStr(strVal)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env string) *mL0.Result[mKt.ISafeInt] {
+func NewSafeIntGetenv(env string) mL0.IResult[mKt.ISafeInt] {
 	return safe_int.NewSafeIntGetenv(env)
 }
 
@@ -108,11 +107,7 @@ func NewInt(val int) mKt.Int {
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-func NewLocalCtx(ctx context.Context) *mL0.Result[mKt.ILocalCtx] {
-	resCtx := local_ctx.NewLocalCtx(ctx)
-	if resCtx.IsErr() {
-		err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
-		return mL0.NewErr[mKt.ILocalCtx](err)
-	}
-	return mL0.NewRes(mKt.ILocalCtx(resCtx.Val()))
+func NewLocalCtx(ctx context.Context) mKt.ILocalCtx {
+	lCtx := local_ctx.NewLocalCtx(ctx)
+	return lCtx
 }

+ 21 - 29
v4/lev1/local_ctx/local_ctx.go

@@ -3,12 +3,11 @@ package local_ctx
 
 import (
 	"context"
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/ctx_value"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/lst_sort"
@@ -20,27 +19,25 @@ type LocalCtx struct {
 	ctx      context.Context // Отменяемый контекст
 	fnCancel func()          // Функция отмены контекста
 
-	dictVal map[string]ICtxValue // Словарь различных значений
-	lstSort *lst_sort.LstSort    // Сортированный список значений
-	log     ILogBuf              // Локальный буфер
+	dictVal map[string]mKt.ICtxValue // Словарь различных значений
+	lstSort *lst_sort.LstSort        // Сортированный список значений
+	log     mKt.ILogBuf              // Локальный буфер
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-func NewLocalCtx(ctx context.Context) *mL0.Result[*LocalCtx] {
-	if ctx == nil {
-		err := fmt.Errorf("NewLocalCtx(): ctx==nil")
-		return mL0.NewErr[*LocalCtx](err)
-	}
+func NewLocalCtx(ctx context.Context) mKt.ILocalCtx {
+	mL0.Hassert(ctx!=nil, "NewLocalCtx(): ctx==nil")
 	_ctx, fnCancel := context.WithCancel(ctx)
 	sf := &LocalCtx{
 		ctx:      _ctx,
 		fnCancel: fnCancel,
-		dictVal:  map[string]ICtxValue{},
+		dictVal:  map[string]mKt.ICtxValue{},
 		lstSort:  lst_sort.NewLstSort(),
-		log:      log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("LocalCtx")),
+		log:      log_buf.NewLogBuf(
+			log_buf.OptIsTerm(true),
+			log_buf.OptPrefix("LocalCtx")),
 	}
-	_ = ILocalCtx(sf)
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Ctx -- возвращает отменяемый контекст.
@@ -56,26 +53,26 @@ func (sf *LocalCtx) Size() int {
 }
 
 // SortedList -- возвращает сортированный список значений.
-func (sf *LocalCtx) SortedList() []ICtxValue {
+func (sf *LocalCtx) SortedList() []mKt.ICtxValue {
 	return sf.lstSort.List()
 }
 
 // Log -- возвращает локальный буферный лог.
-func (sf *LocalCtx) Log() ILogBuf {
+func (sf *LocalCtx) Log() mKt.ILogBuf {
 	return sf.log
 }
 
 // Get -- возвращает хранимое значение.
-func (sf *LocalCtx) Get(key string) *mL0.Option[ICtxValue] {
+func (sf *LocalCtx) Get(key string) mL0.IOption[mKt.ICtxValue] {
 	sf.RLock()
 	defer sf.RUnlock()
 	if key == "" {
-		return mL0.NewNone[ICtxValue]()
+		return mL0.NewNone[mKt.ICtxValue]()
 	}
 	sf.log.Debug("Get(): key='%v'", key)
 	val, isOk := sf.dictVal[key]
 	if !isOk {
-		return mL0.NewNone[ICtxValue]()
+		return mL0.NewNone[mKt.ICtxValue]()
 	}
 	return mL0.NewOpt(val)
 }
@@ -91,7 +88,7 @@ func (sf *LocalCtx) Del(key string) {
 }
 
 // Set -- добавляет значение в контекст.
-func (sf *LocalCtx) Set(key string, val any, comment string) *mL0.Result[bool] {
+func (sf *LocalCtx) Set(key string, val any, comment string) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Set(): key='%v'", key)
@@ -99,19 +96,14 @@ func (sf *LocalCtx) Set(key string, val any, comment string) *mL0.Result[bool] {
 	if isOk {
 		val0 := _val.(*ctx_value.CtxValue)
 		val0.Lock()
-		val0.UpdateAt_ = alias.NewATime()
+		val0.UpdateAt_ = voc.NewETime(voc.VTimeOptVal(""), voc.VTimeOptMut())
 		val0.Val_ = val
 		val0.Unlock()
-		return mL0.NewRes(true)
-	}
-	resVal := ctx_value.NewCtxValue(key, val, comment)
-	if resVal.IsErr() {
-		return mL0.NewErr[bool](resVal.Err())
+		return
 	}
-	_val = resVal.Val()
+	_val = ctx_value.NewCtxValue(key, val, comment)
 	sf.dictVal[key] = _val
 	sf.lstSort.Add(_val)
-	return mL0.NewRes(true)
 }
 
 // Wait -- блокирующий вызов ожидания отмены контекста.

+ 14 - 14
v4/lev1/local_ctx/local_ctx_test.go

@@ -7,7 +7,7 @@ import (
 
 type tester struct {
 	t   *testing.T
-	ctx *LocalCtx
+	lCtx *LocalCtx
 }
 
 func TestLocalCtx(t *testing.T) {
@@ -24,22 +24,22 @@ func TestLocalCtx(t *testing.T) {
 // Ожидает отмены контекста.
 func (sf *tester) done() {
 	sf.t.Log("done")
-	_ = sf.ctx.Size()
-	go sf.ctx.Cancel()
-	sf.ctx.Wait()
+	_ = sf.lCtx.Size()
+	go sf.lCtx.Cancel()
+	sf.lCtx.Wait()
 }
 
 // Удаляет несуществующий ключ из локального контекста.
 func (sf *tester) del() {
 	sf.t.Log("del")
-	sf.ctx.Del("123")
-	sf.ctx.Del("count")
+	sf.lCtx.Del("123")
+	sf.lCtx.Del("count")
 }
 
 // Возвращает хранимое значение.
 func (sf *tester) get() {
 	sf.t.Log("get")
-	optRes := sf.ctx.Get("count")
+	optRes := sf.lCtx.Get("count")
 	ctxVal := optRes.Hassert("get()")
 	count := ctxVal.Val().(int)
 	if count == 15 {
@@ -50,8 +50,8 @@ func (sf *tester) get() {
 // Устанавливает значение.
 func (sf *tester) set() {
 	sf.t.Log("set")
-	sf.ctx.Set("count", 5, "test_val").Hassert("set()")
-	sf.ctx.Set("count", 15, "test_val1").Hassert("set()")
+	sf.lCtx.Set("count", 5, "test_val")
+	sf.lCtx.Set("count", 15, "test_val1")
 }
 
 // Создание нового локального контекста.
@@ -64,12 +64,12 @@ func (sf *tester) new() {
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
 	ctx := context.Background()
-	sf.ctx = NewLocalCtx(ctx).Hassert("newGood1()")
-	_ = sf.ctx.Log()
-	if lst := sf.ctx.SortedList(); lst == nil {
+	sf.lCtx = NewLocalCtx(ctx).(*LocalCtx)
+	_ = sf.lCtx.Log()
+	if lst := sf.lCtx.SortedList(); lst == nil {
 		sf.t.Fatalf("newGood1(): lst==nil")
 	}
-	if ctx := sf.ctx.Ctx(); ctx == nil {
+	if ctx := sf.lCtx.Ctx(); ctx == nil {
 		sf.t.Fatalf("newGood1(): ctx==nil")
 	}
 }
@@ -83,5 +83,5 @@ func (sf *tester) newBad1() {
 		}
 	}()
 	var ctx context.Context
-	sf.ctx = NewLocalCtx(ctx).Hassert("newBad1()")
+	sf.lCtx = NewLocalCtx(ctx).(*LocalCtx)
 }

+ 1 - 1
v4/lev1/log_dict_topic/log_dict_topic.go

@@ -17,7 +17,7 @@ type LogDictTopic struct {
 }
 
 // NewLogDictTopic -- возвращает новый словарь топиков для логирования.
-func NewLogDictTopic(clientBus IBusClient) *mL0.Result[*LogDictTopic] {
+func NewLogDictTopic(clientBus IBusClient) mL0.IResult[*LogDictTopic] {
 	if clientBus == nil {
 		err := fmt.Errorf("NewLogDictTopic(): clientBus == nil")
 		return mL0.NewErr[*LogDictTopic](err)

+ 10 - 10
v4/lev1/log_msg/log_msg.go

@@ -4,12 +4,12 @@ package log_msg
 import (
 	"fmt"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc"
 )
 
 const (
@@ -21,16 +21,16 @@ const (
 
 // logMsg -- сообщение логгера.
 type logMsg struct {
-	level    *quark.QStr[quark.Mut]
-	createAt *ATime
-	msg      *quark.QStr[quark.Fix]
+	level     *quark.QStr[quark.Mut]
+	createdAt ktypes.ITime
+	msg       *quark.QStr[quark.Fix]
 }
 
 // NewLogMsg -- возвращает новое сообщение логгера.
 func NewLogMsg(level int, msg string) ILogMsg {
 	sf := &logMsg{
-		createAt: alias.NewATime(),
-		msg:      quark.NewQStr(msg),
+		createdAt: voc.NewETime(voc.VTimeOptDefault()),
+		msg:       quark.NewQStr(msg),
 	}
 	sf.check(level)
 	return sf
@@ -38,7 +38,7 @@ func NewLogMsg(level int, msg string) ILogMsg {
 
 // String -- возвращает форматированное сообщение лога.
 func (sf *logMsg) String() string {
-	strOut := fmt.Sprintf("%v   %v  %v", sf.level, sf.createAt, sf.msg)
+	strOut := fmt.Sprintf("%v   %v  %v", sf.level, sf.createdAt, sf.msg)
 	return strOut
 }
 
@@ -53,8 +53,8 @@ func (sf *logMsg) Level() *quark.QStr[quark.Mut] {
 }
 
 // CreateAt -- когда сообщение создано.
-func (sf *logMsg) CreateAt() *alias.ATime {
-	return sf.createAt
+func (sf *logMsg) CreateAt() ktypes.ITime {
+	return sf.createdAt
 }
 
 // Проверяет правильность своего состава.

+ 6 - 6
v4/lev1/lst_sort/lst_sort_test.go

@@ -25,7 +25,7 @@ func TestLstSort(t *testing.T) {
 // Нет такого элемента.
 func (sf *tester) del3() {
 	sf.t.Log("del3")
-	val5 := ctx_value.NewCtxValue("val5", 5, "test 5").Hassert("del3()")
+	val5 := ctx_value.NewCtxValue("val5", 5, "test 5")
 	sf.lst.Del(val5)
 	sf.lst.Del(nil)
 }
@@ -72,11 +72,11 @@ func (sf *tester) del() {
 // Добавление элементов в список.
 func (sf *tester) add() {
 	sf.t.Log("add")
-	val0 := ctx_value.NewCtxValue("val0", 0, "test 0").Hassert("add()")
-	val1 := ctx_value.NewCtxValue("val1", 1, "test 1").Hassert("add()")
-	val2 := ctx_value.NewCtxValue("val2", 2, "test 2").Hassert("add()")
-	val3 := ctx_value.NewCtxValue("val3", 3, "test 3").Hassert("add()")
-	val4 := ctx_value.NewCtxValue("val4", 4, "test 4").Hassert("add()")
+	val0 := ctx_value.NewCtxValue("val0", 0, "test 0")
+	val1 := ctx_value.NewCtxValue("val1", 1, "test 1")
+	val2 := ctx_value.NewCtxValue("val2", 2, "test 2")
+	val3 := ctx_value.NewCtxValue("val3", 3, "test 3")
+	val4 := ctx_value.NewCtxValue("val4", 4, "test 4")
 	sf.lst.Add(val1)
 	sf.lst.Add(val4)
 	sf.lst.Add(val0)

+ 4 - 4
v4/lev1/safe_bool/safe_bool.go

@@ -24,7 +24,7 @@ func NewSafeBool() mKt.ISafeBool {
 }
 
 // NewSafeBoolFromStr -- возвращает новое потокобезопасное булево из строки.
-func NewSafeBoolFromStr(strVal string) *mL0.Result[mKt.ISafeBool] {
+func NewSafeBoolFromStr(strVal string) mL0.IResult[mKt.ISafeBool] {
 	sf := NewSafeBool()
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
@@ -35,7 +35,7 @@ func NewSafeBoolFromStr(strVal string) *mL0.Result[mKt.ISafeBool] {
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeBoolGetenv(env string) *mL0.Result[mKt.ISafeBool] {
+func NewSafeBoolGetenv(env string) mL0.IResult[mKt.ISafeBool] {
 	sf := NewSafeBool()
 	res := sf.Getenv(env)
 	if res.IsErr() {
@@ -67,7 +67,7 @@ func (sf *safeBool) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeBool) FromStr(strVal string) *mL0.Result[bool] {
+func (sf *safeBool) FromStr(strVal string) mL0.IResult[bool] {
 	strVal = strings.ToLower(strVal)
 	sf.Lock()
 	defer sf.Unlock()
@@ -83,7 +83,7 @@ func (sf *safeBool) FromStr(strVal string) *mL0.Result[bool] {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBool) Getenv(env string) *mL0.Result[bool] {
+func (sf *safeBool) Getenv(env string) mL0.IResult[bool] {
 	strVal := os.Getenv(env)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {

+ 3 - 3
v4/lev1/safe_bool/safe_bool_test.go

@@ -36,7 +36,7 @@ func (sf *tester) newFromStrGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromStrGood1(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != true {
 		sf.t.Fatalf("newFromStrGood1(): val==false")
 	}
@@ -67,7 +67,7 @@ func (sf *tester) newFromEnvGood2() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != false {
 		sf.t.Fatalf("newFromEnvGood2(): val==true")
 	}
@@ -81,7 +81,7 @@ func (sf *tester) newFromEnvGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != true {
 		sf.t.Fatalf("newFromEnvGood1(): val==false")
 	}

+ 5 - 5
v4/lev1/safe_bool_react/safe_bool_react.go

@@ -27,7 +27,7 @@ func NewSafeBoolReact() mKt.ISafeBoolReact {
 }
 
 // NewSafeBoolReactFromStr -- возвращает новое потокобезопасное булево с реакцией из строки.
-func NewSafeBoolReactFromStr(strVal string) *mL0.Result[mKt.ISafeBoolReact] {
+func NewSafeBoolReactFromStr(strVal string) mL0.IResult[mKt.ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
@@ -38,7 +38,7 @@ func NewSafeBoolReactFromStr(strVal string) *mL0.Result[mKt.ISafeBoolReact] {
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое с реакцией из окружения.
-func NewSafeBoolGetenv(env string) *mL0.Result[mKt.ISafeBoolReact] {
+func NewSafeBoolGetenv(env string) mL0.IResult[mKt.ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.Getenv(env)
 	if res.IsErr() {
@@ -56,7 +56,7 @@ func (sf *safeBoolReact) Delete(key string) {
 }
 
 // Add -- добавляет функцию обратного вызова.
-func (sf *safeBoolReact) Add(key string, fn func(bool)) *mL0.Result[bool] {
+func (sf *safeBoolReact) Add(key string, fn func(bool)) mL0.IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if key == "" {
@@ -98,7 +98,7 @@ func (sf *safeBoolReact) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeBoolReact) FromStr(strVal string) *mL0.Result[bool] {
+func (sf *safeBoolReact) FromStr(strVal string) mL0.IResult[bool] {
 	strVal = strings.ToLower(strVal)
 	sf.Lock()
 	defer sf.Unlock()
@@ -114,7 +114,7 @@ func (sf *safeBoolReact) FromStr(strVal string) *mL0.Result[bool] {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBoolReact) Getenv(env string) *mL0.Result[bool] {
+func (sf *safeBoolReact) Getenv(env string) mL0.IResult[bool] {
 	strVal := os.Getenv(env)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {

+ 3 - 3
v4/lev1/safe_bool_react/safe_bool_react_test.go

@@ -39,7 +39,7 @@ func (sf *tester) newFromStrGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromStrGood1(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != true {
 		sf.t.Fatalf("newFromStrGood1(): val==false")
 	}
@@ -70,7 +70,7 @@ func (sf *tester) newFromEnvGood2() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != false {
 		sf.t.Fatalf("newFromEnvGood2(): val==true")
 	}
@@ -84,7 +84,7 @@ func (sf *tester) newFromEnvGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != true {
 		sf.t.Fatalf("newFromEnvGood1(): val==false")
 	}

+ 5 - 5
v4/lev1/safe_int/safe_int.go

@@ -25,7 +25,7 @@ func NewSafeInt(val int) mKt.ISafeInt {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(strVal string) *mL0.Result[mKt.ISafeInt] {
+func NewSafeIntFromStr(strVal string) mL0.IResult[mKt.ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
@@ -36,7 +36,7 @@ func NewSafeIntFromStr(strVal string) *mL0.Result[mKt.ISafeInt] {
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env string) *mL0.Result[mKt.ISafeInt] {
+func NewSafeIntGetenv(env string) mL0.IResult[mKt.ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.Getenv(env)
 	if res.IsErr() {
@@ -89,14 +89,14 @@ func (sf *safeInt) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeInt) FromStr(strVal string) *mL0.Result[int] {
+func (sf *safeInt) FromStr(strVal string) mL0.IResult[int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromStr(strVal)
 }
 
 // FromByte -- получает число из среза байт.
-func (sf *safeInt) FromByte(binData []byte) *mL0.Result[int] {
+func (sf *safeInt) FromByte(binData []byte) mL0.IResult[int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromByte(binData)
@@ -124,7 +124,7 @@ func (sf *safeInt) ToStr() string {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeInt) Getenv(env string) *mL0.Result[int] {
+func (sf *safeInt) Getenv(env string) mL0.IResult[int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.Getenv(env)

+ 5 - 5
v4/lev1/safe_int/safe_int_test.go

@@ -44,7 +44,7 @@ func (sf *tester) byte() {
 	}
 	resVal := res.FromByte(binData)
 	resVal.Hassert("from []byte")
-	val := resVal.Val()
+	val := resVal.Ok()
 	if val != 1234 {
 		sf.t.Fatalf("byte(): val(%v)!=1234", val)
 	}
@@ -106,7 +106,7 @@ func (sf *tester) newFromStr() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromStr(): err=%v", res.Err())
 	}
-	if val := res.Val(); val.Get() != -60 {
+	if val := res.Ok(); val.Get() != -60 {
 		sf.t.Fatalf("newFromStr(): val(%v)!=-60", val.Get())
 	}
 }
@@ -124,7 +124,7 @@ func (sf *tester) newGetenv() {
 	if res.IsErr() {
 		sf.t.Fatalf("newGetenv(): err=%v", res.Err())
 	}
-	if val := res.Val(); val.Get() != -52 {
+	if val := res.Ok(); val.Get() != -52 {
 		sf.t.Fatalf("newGetenv(): val(%v)!=-52", val.Get())
 	}
 }
@@ -145,7 +145,7 @@ func (sf *tester) getEnvGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("getEnvGood1(): err=%v", res.Err())
 	}
-	if val := res.Val(); val != 45 {
+	if val := res.Ok(); val != 45 {
 		sf.t.Fatalf("getEnvGood1(): val(%v)!=45", val)
 	}
 }
@@ -176,7 +176,7 @@ func (sf *tester) fromStrGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("fromStrGood1(): err=%v", res.Err())
 	}
-	if val := res.Val(); val != 45 {
+	if val := res.Ok(); val != 45 {
 		sf.t.Fatalf("fromStrGood1(): val(%v)!=45", val)
 	}
 }

+ 2 - 2
v4/lev1/safe_string/safe_string.go

@@ -23,7 +23,7 @@ func NewSafeString() mKt.ISafeString {
 }
 
 // NewSafeStringGetenv -- возвращает новую потокобезопасную строку из окружения.
-func NewSafeStringGetenv(env string) *mL0.Result[mKt.ISafeString] {
+func NewSafeStringGetenv(env string) mL0.IResult[mKt.ISafeString] {
 	sf := NewSafeString()
 	res := sf.Getenv(env)
 	if res.IsErr() {
@@ -62,7 +62,7 @@ func (sf *safeString) Reset() {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeString) Getenv(env string) *mL0.Result[string] {
+func (sf *safeString) Getenv(env string) mL0.IResult[string] {
 	strVal := os.Getenv(env)
 	if strVal == "" {
 		err := fmt.Errorf("safeString.Getenv(): from env(%v), val is empty", env)

+ 2 - 2
v4/lev1/safe_string/safe_string_test.go

@@ -38,7 +38,7 @@ func (sf *tester) newFromEnvGood2() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != "false" {
 		sf.t.Fatalf("newFromEnvGood2(): val==true")
 	}
@@ -52,7 +52,7 @@ func (sf *tester) newFromEnvGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
 	}
-	sb := res.Val()
+	sb := res.Ok()
 	if val := sb.Get(); val != "true" {
 		sf.t.Fatalf("newFromEnvGood1(): val==false")
 	}

+ 12 - 26
v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go

@@ -2,7 +2,6 @@
 package dict_sub_hook
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -13,23 +12,18 @@ import (
 
 // dictSubHook -- словарь потребителей топика по подписке.
 type dictSubHook struct {
-	ctx   mKt.IKernelCtx
+	kCtx   mKt.IKernelCtx
 	dict  map[*mKa.AHandlerName]bool // В качестве ключа -- URL веб-хука
 	block sync.RWMutex
 }
 
 // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
-func NewDictSubHook() *mL0.Result[mKt.IDictSubHook] {
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("dictSubHook.NewDictSubHook(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[mKt.IDictSubHook](err)
-	}
+func NewDictSubHook() mKt.IDictSubHook {
 	sf := &dictSubHook{
-		ctx:  resKernCtx.Val(),
+		kCtx:  kctx.GetKernelCtx(),
 		dict: map[*mKa.AHandlerName]bool{},
 	}
-	return mL0.NewRes(mKt.IDictSubHook(sf))
+	return sf
 }
 
 // Unsubscribe -- удаляет из словаря подписки обработчик.
@@ -37,30 +31,22 @@ func (sf *dictSubHook) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if handler == nil {
-		sf.ctx.Log().Err("dictSubHook.Unsubscribe(): handler==nil")
+		sf.kCtx.Log().Err("dictSubHook.Unsubscribe(): handler==nil")
 		return
 	}
 	handlerName := handler.Name()
 	delete(sf.dict, handlerName)
-	sf.ctx.Del(handlerName.Get())
+	sf.kCtx.Del(handlerName.Get())
 }
 
 // Subscribe -- добавляет в словарь подписки новый обработчик.
-func (sf *dictSubHook) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
+func (sf *dictSubHook) Subscribe(handler mKt.IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	if handler == nil {
-		err := fmt.Errorf("dictSubHook.Subscribe(): handler==nil")
-		return mL0.NewErr[bool](err)
-	}
+	mL0.Hassert(handler!=nil, "dictSubHook.Subscribe(): handler==nil")
 	handlerName := handler.Name()
 	sf.dict[handlerName] = true
-	res := sf.ctx.Set(handlerName.Get(), handler, "subscribe handler")
-	if res.IsErr() {
-		err := fmt.Errorf("dictSubHook.Subscribe(): in set subscribe handler in kernel ctx, err=\n\t%w", res.Err())
-		return mL0.NewErr[bool](err)
-	}
-	return mL0.NewRes(true)
+	sf.kCtx.Set(handlerName.Get(), handler, "subscribe handler")
 }
 
 // Read -- вызывает все обработчики словаря подписок.
@@ -68,12 +54,12 @@ func (sf *dictSubHook) Read(binMsg []byte) {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	for handlerName := range sf.dict {
-		optHand := sf.ctx.Get(handlerName.Get())
+		optHand := sf.kCtx.Get(handlerName.Get())
 		if optHand.IsNone() {
-			sf.ctx.Del(handlerName.Get())
+			sf.kCtx.Del(handlerName.Get())
 			continue
 		}
-		handler := optHand.Val().Val().(mKt.IBusHandlerSubscribe)
+		handler := optHand.Some().Val().(mKt.IBusHandlerSubscribe)
 		go handler.FnBack(binMsg)
 	}
 }

+ 5 - 8
v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -52,9 +52,9 @@ func (sf *tester) add() {
 
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
-	sf.dict.Subscribe(sf.handSub).Hassert("addGood1()")
-	sf.dict.Subscribe(sf.handSub).Hassert("addGood1()")
-	sf.dict.Subscribe(sf.handSub2).Hassert("addGood1()")
+	sf.dict.Subscribe(sf.handSub)
+	sf.dict.Subscribe(sf.handSub)
+	sf.dict.Subscribe(sf.handSub2)
 	if _len := len(sf.dict.dict); _len != 2 {
 		sf.t.Fatalf("new(): len(%v)!=2", _len)
 	}
@@ -63,16 +63,13 @@ func (sf *tester) addGood1() {
 // нет веб-хука для добавления.
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1")
-	res := sf.dict.Subscribe(nil)
-	if res.IsOk() {
-		sf.t.Fatalf("addBad1(): res.IsOk()==true")
-	}
+	sf.dict.Subscribe(nil)
 }
 
 // Создание словаря.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.dict = NewDictSubHook().Hassert("new()").(*dictSubHook)
+	sf.dict = NewDictSubHook().(*dictSubHook)
 	if sf.dict == nil {
 		sf.t.Fatalf("new(): dict==nil")
 	}

+ 6 - 11
v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go

@@ -23,21 +23,16 @@ type dictServe struct {
 }
 
 // NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов.
-func NewDictServe() *mL0.Result[*dictServe] {
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("NewDictServe(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*dictServe](err)
-	}
+func NewDictServe() *dictServe {
 	sf := &dictServe{
-		kCtx:      resKernCtx.Val(),
+		kCtx:      kctx.GetKernelCtx(),
 		dictServe: map[*mKa.ATopic]mKt.IBusHandlerServe{},
 	}
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Register -- регистрирует обработчик запросов.
-func (sf *dictServe) Register(handler mKt.IBusHandlerServe) *mL0.Result[bool] {
+func (sf *dictServe) Register(handler mKt.IBusHandlerServe) mL0.IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
@@ -63,7 +58,7 @@ func (sf *dictServe) Unregister(handler mKt.IBusHandlerServe) {
 }
 
 // SendRequest -- вызывает обработчик при поступлении запроса.
-func (sf *dictServe) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]byte] {
+func (sf *dictServe) SendRequest(topic *mKa.ATopic, binReq []byte) mL0.IResult[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	handler, isOk := sf.dictServe[topic]
@@ -72,7 +67,7 @@ func (sf *dictServe) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[
 		return mL0.NewErr[[]byte](err)
 	}
 	var (
-		chRes = make(chan *mL0.Result[[]byte], 2)
+		chRes = make(chan mL0.IResult[[]byte], 2)
 	)
 	ctx, fnCancel := context.WithTimeout(sf.kCtx.Ctx(), time.Millisecond*time.Duration(TimeoutDefault))
 	defer fnCancel()

+ 3 - 3
v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go

@@ -39,7 +39,7 @@ func TestDictSub(t *testing.T) {
 // Работа ядра завершена.
 func (sf *tester) callBad3() {
 	sf.t.Log("callBad3")
-	ctx := kctx.GetKernelCtx().Hassert("callBad3()")
+	ctx := kctx.GetKernelCtx()
 	ctx.Cancel()
 	ctx.Wg().Wait()
 	sf.dict.Register(sf.hand).Hassert("callBad3()")
@@ -73,7 +73,7 @@ func (sf *tester) sendGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("sendGood1(): err=%v", res.Err())
 	}
-	if res.Val() == nil {
+	if res.Ok() == nil {
 		sf.t.Fatalf("sendGood1(): binMsg==nil")
 	}
 }
@@ -135,7 +135,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.dict = NewDictServe().Hassert("newGood1()")
+	sf.dict = NewDictServe()
 	if sf.dict == nil {
 		sf.t.Fatalf("newGood1(): DictServe==nil")
 	}

+ 8 - 30
v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go

@@ -2,7 +2,6 @@
 package dict_topic_sub
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -25,18 +24,12 @@ type dictTopicSub struct {
 }
 
 // NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков.
-func NewDictTopicSub() *mL0.Result[*dictTopicSub] {
-	resCtx := kctx.GetKernelCtx()
-	if resCtx.IsErr() {
-		err := fmt.Errorf("NewDictTopicSub(): kCtx==nil")
-		return mL0.NewErr[*dictTopicSub](err)
-	}
-	kCtx := resCtx.Val()
+func NewDictTopicSub() *dictTopicSub {
 	sf := &dictTopicSub{
-		kCtx:          kCtx,
+		kCtx:          kctx.GetKernelCtx(),
 		dictTopicHook: map[*mKa.ATopic]mKt.IDictSubHook{},
 	}
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Read -- вызывает обработчики при поступлении события.
@@ -55,39 +48,24 @@ func (sf *dictTopicSub) Read(topic *mKa.ATopic, binMsg []byte) {
 }
 
 // Subscribe -- подписывает обработчик на топик.
-func (sf *dictTopicSub) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
+func (sf *dictTopicSub) Subscribe(handler mKt.IBusHandlerSubscribe){
 	sf.Lock()
 	defer sf.Unlock()
-	if handler == nil {
-		err := fmt.Errorf("dictTopicSub.Subscribe(): handler==nil")
-		return mL0.NewErr[bool](err)
-	}
+	mL0.Hassert(handler!=nil,"dictTopicSub.Subscribe(): handler==nil")
 	topic := handler.Topic()
 	dictSubHook := sf.dictTopicHook[topic]
 	if dictSubHook == nil {
-		resNewDictTopicSub := dict_sub_hook.NewDictSubHook()
-		if resNewDictTopicSub.IsErr() {
-			err := fmt.Errorf("dictTopicSub.Subscribe(): NewDictSubHook(), err=\n\t%w", resNewDictTopicSub.Err())
-			return mL0.NewErr[bool](err)
-		}
-		dictSubHook = resNewDictTopicSub.Val()
+		dictSubHook := dict_sub_hook.NewDictSubHook()
 		sf.dictTopicHook[topic] = dictSubHook
 	}
-	res := dictSubHook.Subscribe(handler)
-	if res.IsErr() {
-		err := fmt.Errorf("dictTopicSub.Subscribe(): in add subscribe dict handler, err=\n\t%w", res.Err())
-		return mL0.NewErr[bool](err)
-	}
-	return mL0.NewRes(true)
+	dictSubHook.Subscribe(handler)
 }
 
 // Unsubscribe -- отписывает обработчик.
 func (sf *dictTopicSub) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 	sf.Lock()
 	defer sf.Unlock()
-	if handler == nil {
-		return
-	}
+	mL0.Hassert(handler!=nil, "dictTopicSub.Unsubscribe(): handler==nil")
 	topic := handler.Topic()
 	dictSubHook := sf.dictTopicHook[topic]
 	if dictSubHook == nil {

+ 4 - 9
v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go

@@ -84,24 +84,19 @@ func (sf *tester) callGood1() {
 // повторное добавление обработчика.
 func (sf *tester) addGood2() {
 	sf.t.Log("addGood2")
-	res := sf.dict.Subscribe(sf.hand)
-	res.Hassert("addGood2()")
+	sf.dict.Subscribe(sf.hand)
 }
 
 // Правильное добавление обработчика подписки.
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1()")
-	res := sf.dict.Subscribe(sf.hand)
-	res.Hassert("addGood1()")
+	sf.dict.Subscribe(sf.hand)
 }
 
 // Вместо обработчика пустышка.
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1()")
-	res := sf.dict.Subscribe(nil)
-	if res.IsOk() {
-		sf.t.Fatalf("addBad1(): res.IsOk()==true")
-	}
+	sf.dict.Subscribe(nil)
 }
 
 // Нет топика.
@@ -134,7 +129,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.dict = NewDictTopicSub().Hassert("newGood1()")
+	sf.dict = NewDictTopicSub()
 	if sf.dict == nil {
 		sf.t.Fatalf("newGood1(): DictSub==nil")
 	}

+ 24 - 57
v4/lev2/kbus_base/kbus_base.go

@@ -21,9 +21,9 @@ var (
 
 // KBusBase -- базовая часть шины данных.
 type KBusBase struct {
-	Ctx_      mKt.IKernelCtx
+	KCtx_     mKt.IKernelCtx
 	IsWork_   mKt.ISafeBool
-	ctx       mKt.ILocalCtx
+	lCtx      mKt.ILocalCtx
 	log       mKt.ILogBuf
 	dictSub   mKt.IDictTopicSub
 	dictServe mKt.IDictTopicServe
@@ -35,53 +35,29 @@ var (
 )
 
 // GetKernelBusBase -- возвращает базовую шину сообщений.
-func GetKernelBusBase() *mL0.Result[*KBusBase] {
+func GetKernelBusBase() *KBusBase {
 	block.Lock()
 	defer block.Unlock()
 	if Bus_ != nil {
-		return mL0.NewRes(Bus_)
-	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetKernelBusBase(): in get from kernCtx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*KBusBase](err)
-	}
-	kCtx := resKernCtx.Val()
-	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
-	if resLocCtx.IsErr() {
-		err := fmt.Errorf("GetKernelBusBase(): in get from localCtx, err=\n\t%w", resLocCtx.Err())
-		return mL0.NewErr[*KBusBase](err)
-	}
-	resDictServe := dict_topic_serve.NewDictServe()
-	if resDictServe.IsErr() {
-		err := fmt.Errorf("GetKernelBusBase(): in get from dictServe, err=\n\t%w", resDictServe.Err())
-		return mL0.NewErr[*KBusBase](err)
-	}
-	resDictTopicSu := dict_topic_sub.NewDictTopicSub()
-	if resDictTopicSu.IsErr() {
-		err := fmt.Errorf("GetKernelBusBase(): in get from dictTopicSu, err=\n\t%w", resDictTopicSu.Err())
-		return mL0.NewErr[*KBusBase](err)
+		return Bus_
 	}
+	kCtx := kctx.GetKernelCtx()
+	lCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	Bus_ = &KBusBase{
-		Ctx_:      resKernCtx.Val(),
+		KCtx_:     kCtx,
 		IsWork_:   mL1.NewSafeBool(),
-		dictSub:   resDictTopicSu.Val(),
-		dictServe: mKt.IDictTopicServe(resDictServe.Val()),
-		ctx:       resLocCtx.Val(),
+		dictSub:   dict_topic_sub.NewDictTopicSub(),
+		dictServe: dict_topic_serve.NewDictServe(),
+		lCtx:      lCtx,
 	}
-	Bus_.log = Bus_.ctx.Log()
+	Bus_.log = Bus_.lCtx.Log()
 	go Bus_.close()
 	go Bus_.run()
 	Bus_.IsWork_.Set()
-	res := Bus_.Ctx_.Wg().Add(busBaseStreamName)
-	res.Hassert("GetKernelBusBase(): in add name stream(%v)", busBaseStreamName)
-	resSet := Bus_.Ctx_.Set("kernBusBase", Bus_, "base of data bus")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetKernelBusBase(): in set kernel bus base to kernel ctx, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[*KBusBase](err)
-	}
+	Bus_.KCtx_.Wg().Add(busBaseStreamName)
+	Bus_.KCtx_.Set("kernBusBase", Bus_, "base of data bus")
 	_ = mKt.IKernelBus(Bus_)
-	return mL0.NewRes(Bus_)
+	return Bus_
 }
 
 // Log -- возвращает лог шины.
@@ -103,24 +79,15 @@ func (sf *KBusBase) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывает обработчик на топик.
-func (sf *KBusBase) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
+func (sf *KBusBase) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[bool]{
 	sf.log.Debug("KBusBase.Subscribe(): handler='%v'", handler.Name())
-	if !sf.IsWork_.Get() {
-		err := fmt.Errorf("KBusBase.Subscribe():  handler='%v', bus already closed", handler.Name())
-		sf.log.Err(err.Error())
-		return mL0.NewErr[bool](err)
-	}
-	res := sf.dictSub.Subscribe(handler)
-	if res.IsErr() {
-		err := fmt.Errorf("KBusBase.Subscribe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
-		sf.log.Err(err.Error())
-		return mL0.NewErr[bool](err)
-	}
+	mL0.Hassert(!sf.IsWork_.Get(), "KBusBase.Subscribe():  handler='%v', bus already closed", handler.Name())
+	sf.dictSub.Subscribe(handler)
 	return mL0.NewRes(true)
 }
 
 // SendRequest -- отправляет запрос в шину данных.
-func (sf *KBusBase) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]byte] {
+func (sf *KBusBase) SendRequest(topic *mKa.ATopic, binReq []byte) mL0.IResult[[]byte] {
 	sf.log.Debug("KBusBase.SendRequest(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.SendRequest():  topic='%v', bus already closed", topic)
@@ -137,7 +104,7 @@ func (sf *KBusBase) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]
 }
 
 // RegisterServe -- регистрирует обработчики входящих запросов.
-func (sf *KBusBase) RegisterServe(handler mKt.IBusHandlerServe) *mL0.Result[bool] {
+func (sf *KBusBase) RegisterServe(handler mKt.IBusHandlerServe) mL0.IResult[bool] {
 	if handler == nil {
 		return mL0.NewErr[bool](fmt.Errorf("KBusBase.RegisterServe(): IBusHandlerServe==nil"))
 	}
@@ -152,7 +119,7 @@ func (sf *KBusBase) RegisterServe(handler mKt.IBusHandlerServe) *mL0.Result[bool
 }
 
 // Publish -- публикует сообщение в шину.
-func (sf *KBusBase) Publish(topic *mKa.ATopic, binMsg []byte) *mL0.Result[bool] {
+func (sf *KBusBase) Publish(topic *mKa.ATopic, binMsg []byte) mL0.IResult[bool] {
 	sf.log.Debug("KBusBase.Publish(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.Publish(): topic='%v',bus already closed", topic)
@@ -171,13 +138,13 @@ func (sf *KBusBase) IsWork() bool {
 
 // Ожидает закрытия шины в отдельном потоке.
 func (sf *KBusBase) close() {
-	sf.Ctx_.Wait()
-	sf.Ctx_.Lock()
-	defer sf.Ctx_.Unlock()
+	sf.KCtx_.Wait()
+	sf.KCtx_.Lock()
+	defer sf.KCtx_.Unlock()
 	if !sf.IsWork_.Get() {
 		return
 	}
 	sf.IsWork_.Reset()
-	sf.Ctx_.Wg().Done(busBaseStreamName)
+	sf.KCtx_.Wg().Done(busBaseStreamName)
 	sf.log.Debug("KBusBase.close(): done")
 }

+ 24 - 27
v4/lev2/kbus_base/kbus_base_test.go

@@ -12,7 +12,7 @@ import (
 
 type tester struct {
 	t        *testing.T
-	bus      IKernelBus
+	kBus      IKernelBus
 	handSub  *mock_hand_sub_local.MockHandlerSub
 	handServ *mock_hand_serve.MockHandlerServe
 }
@@ -48,8 +48,8 @@ func (sf *tester) unsubGood1() {
 			sf.t.Fatalf("unsubGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.bus.Unsubscribe(sf.handSub)
-	sf.bus.Unsubscribe(sf.handSub)
+	sf.kBus.Unsubscribe(sf.handSub)
+	sf.kBus.Unsubscribe(sf.handSub)
 }
 
 // Отписка от топика, нет обработчика.
@@ -60,29 +60,29 @@ func (sf *tester) unsubBad1() {
 			sf.t.Fatalf("unsubBad1(): panic==nil")
 		}
 	}()
-	sf.bus.Unsubscribe(nil)
+	sf.kBus.Unsubscribe(nil)
 }
 
 func (sf *tester) reqGood1() {
 	sf.t.Log("reqGood1")
-	res := sf.bus.SendRequest(sf.handServ.Topic_, []byte("test_msg"))
+	res := sf.kBus.SendRequest(sf.handServ.Topic_, []byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("reqGood1(): err=%v", res.Err())
 	}
-	if res.Val() == nil {
+	if res.Ok() == nil {
 		sf.t.Fatalf("reqGood1(): binMsg==nil")
 	}
 }
 
 func (sf *tester) servGood1() {
 	sf.t.Log("servGood1")
-	sf.bus.RegisterServe(sf.handServ).Hassert("servGood1()")
+	sf.kBus.RegisterServe(sf.handServ).Hassert("servGood1()")
 }
 
 // Нет обработчика для обслуживания запросов.
 func (sf *tester) servBad1() {
 	sf.t.Log("servBad1")
-	res := sf.bus.RegisterServe(nil)
+	res := sf.kBus.RegisterServe(nil)
 	if res.IsOk() {
 		sf.t.Fatalf("servBad1(): err==nil")
 	}
@@ -95,7 +95,7 @@ var (
 // Нет такого топика.
 func (sf *tester) reqBad1() {
 	sf.t.Log("reqBad1")
-	res := sf.bus.SendRequest(qName1, []byte("test_msg"))
+	res := sf.kBus.SendRequest(qName1, []byte("test_msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("reqBad1(): err==nil")
 	}
@@ -109,7 +109,7 @@ func (sf *tester) pubGood10() {
 			sf.t.Fatalf("pubGood10(): panic=%v", _panic)
 		}
 	}()
-	res := sf.bus.Publish(qName1, []byte("test_msg"))
+	res := sf.kBus.Publish(qName1, []byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("pubGood10(): err=%v", res.Err())
 	}
@@ -122,10 +122,7 @@ func (sf *tester) subGood1() {
 			sf.t.Fatalf("subGood1(): panic=%v", _panic)
 		}
 	}()
-	res := sf.bus.Subscribe(sf.handSub)
-	if res.IsErr() {
-		sf.t.Fatalf("subGood1(): err=%v", res.Err())
-	}
+	sf.kBus.Subscribe(sf.handSub)
 }
 
 // Нет обработчик подписки.
@@ -136,7 +133,7 @@ func (sf *tester) subBad1() {
 			sf.t.Fatalf("subBad1(): panic==nil")
 		}
 	}()
-	_ = sf.bus.Subscribe(nil)
+	sf.kBus.Subscribe(nil)
 }
 
 // Создание локальной шины.
@@ -153,22 +150,22 @@ var (
 // Закрытие шины.
 func (sf *tester) close() {
 	sf.t.Log("close")
-	ctx := kctx.GetKernelCtx().Hassert("close()")
-	ctx.Cancel()
-	ctx.Wg().Wait()
-	sf.bus.(*KBusBase).close()
-	if sf.bus.IsWork() {
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Cancel()
+	kCtx.Wg().Wait()
+	sf.kBus.(*KBusBase).close()
+	if sf.kBus.IsWork() {
 		sf.t.Fatalf("close(): bus work")
 	}
-	res := sf.bus.Subscribe(sf.handSub)
+	res := sf.kBus.Subscribe(sf.handSub)
 	if res.IsOk() {
 		sf.t.Fatalf("close(): err==nil")
 	}
-	res = sf.bus.Publish(qName1, []byte("test_msg"))
+	res = sf.kBus.Publish(qName1, []byte("test_msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("close(): err==nil")
 	}
-	res1 := sf.bus.SendRequest(qNameA, []byte("test_msg"))
+	res1 := sf.kBus.SendRequest(qNameA, []byte("test_msg"))
 	if res1.IsOk() {
 		sf.t.Fatalf("close(): err==nil")
 	}
@@ -181,12 +178,12 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.bus = GetKernelBusBase().Hassert("newGood1()")
-	sf.bus = GetKernelBusBase().Hassert("newGood1()")
-	if !sf.bus.IsWork() {
+	sf.kBus = GetKernelBusBase()
+	sf.kBus = GetKernelBusBase()
+	if !sf.kBus.IsWork() {
 		sf.t.Fatalf("newGood1(): bus not work")
 	}
-	if log := sf.bus.Log(); log == nil {
+	if log := sf.kBus.Log(); log == nil {
 		sf.t.Fatalf("newGood1(): log==nil")
 	}
 }

+ 41 - 51
v4/lev2/kbus_http/client_bus_http/client_bus_http.go

@@ -26,7 +26,7 @@ import (
 // ClientBusHttp -- клиент HTTP-шины.
 type ClientBusHttp struct {
 	bus       mKt.IKernelBus
-	ctx       mKt.ILocalCtx
+	lCtx      mKt.ILocalCtx
 	log       mKt.ILogBuf
 	isWork    mKt.ISafeBool
 	urlRemote string // URL дистанционной шины
@@ -34,41 +34,24 @@ type ClientBusHttp struct {
 }
 
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины.
-func NewClientBusHttp(urlRemote string) *mL0.Result[mKt.IBusClient] {
+func NewClientBusHttp(urlRemote string) mKt.IBusClient {
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("ClientBusHttp"))
 	log.Debug("NewClientBusHttp()")
-	if urlRemote == "" {
-		err := fmt.Errorf("NewClientBusHttp(): urlRemote is empty")
-		return mL0.NewErr[mKt.IBusClient](err)
-	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("NewClientBusHttp(): in get ctx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[mKt.IBusClient](err)
-	}
-	kCtx := resKernCtx.Val()
+	mL0.Hassert(urlRemote != "", "NewClientBusHttp(): urlRemote is empty")
+	kCtx := kctx.GetKernelCtx()
 	resLocal := safe_string.NewSafeStringGetenv("LOCAL_HTTP_URL")
-	if resLocal.IsErr() {
-		err := fmt.Errorf("NewClientBusHttp(): in get env LOCAL_HTTP_URL, err=\n\t%w", resLocal.Err())
-		return mL0.NewErr[mKt.IBusClient](err)
-	}
-	urlLocal := resLocal.Val()
-	resBus := kbus_http.GetKernelBusHttp()
-	if resBus.IsErr() {
-		err := fmt.Errorf("NewClientBusHttp(): in get bus, err=\n\t%w", resBus.Err())
-		return mL0.NewErr[mKt.IBusClient](err)
-	}
-	kBusHttp := resBus.Val()
-	lCtx := mL1.NewLocalCtx(kCtx.Ctx())
+	resLocal.Hassert("NewClientBusHttp(): in get env LOCAL_HTTP_URL)")
+	urlLocal := resLocal.Ok()
+	kBusHttp := kbus_http.GetKernelBusHttp()
 	sf := &ClientBusHttp{
-		ctx:       lCtx.Val(),
+		lCtx:      mL1.NewLocalCtx(kCtx.Ctx()),
 		log:       log,
 		bus:       kBusHttp,
 		isWork:    mL1.NewSafeBool(),
 		urlRemote: strings.TrimSuffix(urlRemote, "/"),
 		urlLocal:  strings.TrimSuffix(urlLocal.Get(), "/"),
 	}
-	return mL0.NewRes(mKt.IBusClient(sf))
+	return sf
 }
 
 // Unsubscribe -- отписывается от топика в дистанционной шине.
@@ -88,13 +71,12 @@ func (sf *ClientBusHttp) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/unsub", reader)
 	mL1.Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in new request, err=\n\t%v", err)
 
-	binBody, err := sf.makePost(hReq)
-	if err != nil {
-		sf.log.Err("Unsubscribe(): in make request, err=\n\t%v", err)
+	resBody := sf.makePost(hReq)
+	if resBody.IsErr() {
 		return
 	}
 	resp := &msg_unsub.UnsubResp{}
-	err = json.Unmarshal(binBody, resp)
+	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		sf.log.Err("Unsubscribe(): in unmarshal response, err=\n\t%v", err)
 		return
@@ -108,9 +90,9 @@ func (sf *ClientBusHttp) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывается на топик в дистанционной шине.
-func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
+func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[bool] {
 	_uuid, err := uuid.NewV6()
-	mL1.Hassert()(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", err)
+	mL0.Hassert(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_sub.SubscribeReq{
 		Topic_:   handler.Topic(),
 		Uuid_:    _uuid.String(),
@@ -121,15 +103,15 @@ func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result
 	body := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/sub", body)
-	mL1.Hassert()(err == nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v")
+	mL0.Hassert(err != nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v")
 
-	binBody, err := sf.makePost(hReq)
-	if err != nil {
-		err := fmt.Errorf("ClientBusHttp.Subscribe(): in make request, err=\n\t%w", err)
+	resBody := sf.makePost(hReq)
+	if resBody.IsErr() {
+		err := fmt.Errorf("ClientBusHttp.Subscribe(): in make POST-request, err=\n\t%w", err)
 		return mL0.NewErr[bool](err)
 	}
 	resp := &msg_sub.SubscribeResp{}
-	err = json.Unmarshal(binBody, resp)
+	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[bool](err)
@@ -147,7 +129,7 @@ func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result
 }
 
 // SendRequest -- отправляет в дистанционную шину запрос.
-func (sf *ClientBusHttp) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]byte] {
+func (sf *ClientBusHttp) SendRequest(topic *mKa.ATopic, binReq []byte) mL0.IResult[[]byte] {
 	_uuid, err := uuid.NewV6()
 	mL1.Hassert()(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_serve.ServeReq{
@@ -162,13 +144,13 @@ func (sf *ClientBusHttp) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Resu
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/request", body)
 	mL1.Hassert()(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
 
-	binBody, err := sf.makePost(hReq)
-	if err != nil {
+	resBody := sf.makePost(hReq)
+	if resBody.IsErr() {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
-		return mL0.NewErr[[]byte](err)
+		return mL0.WrapErr(resBody, err)
 	}
 	resp := &msg_serve.ServeResp{}
-	err = json.Unmarshal(binBody, resp)
+	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[[]byte](err)
@@ -185,7 +167,7 @@ func (sf *ClientBusHttp) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Resu
 }
 
 // RegisterServe -- регистрирует в локальной шине обработчик.
-func (sf *ClientBusHttp) RegisterServe(handler mKt.IBusHandlerServe) *mL0.Result[bool] {
+func (sf *ClientBusHttp) RegisterServe(handler mKt.IBusHandlerServe) mL0.IResult[bool] {
 	if handler == nil {
 		return mL0.NewErr[bool](fmt.Errorf("ClientBusHttp.RegisterServe(): handler==nil"))
 	}
@@ -198,7 +180,7 @@ func (sf *ClientBusHttp) RegisterServe(handler mKt.IBusHandlerServe) *mL0.Result
 }
 
 // Publish -- публикует сообщение в дистанционной шину.
-func (sf *ClientBusHttp) Publish(topic *mKa.ATopic, binMsg []byte) *mL0.Result[bool] {
+func (sf *ClientBusHttp) Publish(topic *mKa.ATopic, binMsg []byte) mL0.IResult[bool] {
 	_uuid, err := uuid.NewV6()
 	mL1.Hassert()(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_pub.PublishReq{
@@ -213,13 +195,13 @@ func (sf *ClientBusHttp) Publish(topic *mKa.ATopic, binMsg []byte) *mL0.Result[b
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/pub", body)
 	mL1.Hassert()(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
 
-	binBody, err := sf.makePost(hReq)
-	if err != nil {
+	resBody := sf.makePost(hReq)
+	if resBody.IsErr() {
 		err := fmt.Errorf("ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
 		return mL0.NewErr[bool](err)
 	}
 	resp := &msg_pub.PublishResp{}
-	err = json.Unmarshal(binBody, resp)
+	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[bool](err)
@@ -236,21 +218,29 @@ func (sf *ClientBusHttp) Publish(topic *mKa.ATopic, binMsg []byte) *mL0.Result[b
 }
 
 // Единый обработчик запросов.
-func (sf *ClientBusHttp) makePost(hReq *http.Request) ([]byte, error) {
+func (sf *ClientBusHttp) makePost(hReq *http.Request) mKt.IResult[[]byte] {
 	hReq.Header.Add("Content-Type", "application/json")
 	_resp, err := http.DefaultClient.Do(hReq)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.makePost(): after request, err=\n\t%w", err)
-		return nil, err
+		return mL0.NewErr[[]byte](err)
 	}
 	defer func() {
 		_ = _resp.Body.Close()
 	}()
 	if _resp.StatusCode != http.StatusOK {
-		return nil, fmt.Errorf("ClientBusHttp.makePost(): url=%q, status=%q", hReq.URL, _resp.Status)
+		err := fmt.Errorf("ClientBusHttp.makePost(): url=%q, status=%q",
+			hReq.URL, _resp.Status)
+		return mL0.NewErr[[]byte](err)
 	}
+
 	binBody, err := io.ReadAll(_resp.Body)
-	return binBody, err
+	if err != nil {
+		err := fmt.Errorf("ClientBusHttp.makePost(): after read body, err=\n\t%v",
+			err)
+		return mL0.NewErr[[]byte](err)
+	}
+	return mL0.NewRes(binBody)
 }
 
 // Log -- возвращает локальный лог клиента.

+ 24 - 30
v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go

@@ -6,9 +6,10 @@ import (
 	"strings"
 	"testing"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -24,12 +25,12 @@ const (
 
 type tester struct {
 	t        *testing.T
-	me       IMockEnv
-	ctx      IKernelCtx
+	me       mL1.IMockEnv
+	kCtx     mKt.IKernelCtx
 	cl       *ClientBusHttp
 	handSub  *mock_hand_sub_http.MockHandSubHttp
 	handServ *mock_hand_serve.MockHandlerServe
-	bus      *kbus_base.KBusBase
+	kBus     *kbus_base.KBusBase
 }
 
 var (
@@ -42,11 +43,11 @@ func TestClientBusHttp(t *testing.T) {
 	handServ := mock_hand_serve.NewMockHandlerServe(qNameServ, "local_hook")
 	sf := &tester{
 		t:        t,
-		me:       MakeEnv(),
-		ctx:      kctx.GetKernelCtx().Hassert("TestClientBusHttp()"),
+		me:       mL1.MakeEnv(),
+		kCtx:     kctx.GetKernelCtx(),
 		handSub:  handSub,
 		handServ: handServ,
-		bus:      kbus_base.GetKernelBusBase().Hassert("TestClientBusHttp()"),
+		kBus:     kbus_base.GetKernelBusBase(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
@@ -65,8 +66,8 @@ func TestClientBusHttp(t *testing.T) {
 	sf.unsubGood1()
 	sf.reg()
 	sf.send()
-	sf.ctx.Cancel()
-	sf.ctx.Wg().Wait()
+	sf.kCtx.Cancel()
+	sf.kCtx.Wg().Wait()
 }
 
 // Отправка запросов.
@@ -83,10 +84,10 @@ func (sf *tester) sendGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("sendGood1(): err=%v", res.Err())
 	}
-	if res.Val() == nil {
+	if res.Ok() == nil {
 		sf.t.Fatalf("sendGood1(): binResp==nil")
 	}
-	strResp := string(res.Val())
+	strResp := string(res.Ok())
 	if strResp != "test msg 456" {
 		sf.t.Fatalf("sendGood1(): strResp(%v)!='test msg 456'", strResp)
 	}
@@ -167,8 +168,8 @@ func (sf *tester) pub() {
 // С шиной что-то случилось.
 func (sf *tester) pubBad2() {
 	sf.t.Log("pubBad2")
-	sf.bus.IsWork_.Reset()
-	defer sf.bus.IsWork_.Set()
+	sf.kBus.IsWork_.Reset()
+	defer sf.kBus.IsWork_.Set()
 	defer func() {
 		if _panic := recover(); _panic != nil {
 			sf.t.Fatalf("pubBad2(): panic=%v", _panic)
@@ -200,7 +201,7 @@ func (sf *tester) pubGood1() {
 		sf.t.Fatalf("pubGood1(): err=%v", res.Err())
 	}
 	for {
-		SleepMs()
+		mL0.SleepMs()
 		if sf.handSub.Msg() != "" {
 			break
 		}
@@ -287,11 +288,11 @@ func (sf *tester) subBad4() {
 	if err != nil {
 		sf.t.Fatalf("subBad4(): err=%v", err)
 	}
-	binData, err := sf.cl.makePost(hReq)
-	if err == nil {
+	resData := sf.cl.makePost(hReq)
+	if resData.IsOk() {
 		sf.t.Fatalf("subBad4(): err==nil")
 	}
-	if binData != nil {
+	if resData.Ok() != nil {
 		sf.t.Fatalf("subBad4(): binData!=nil")
 	}
 }
@@ -387,10 +388,9 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.ctx.Set("monolitName", "test_client_bus_http", "comment").Hassert("newGood1()")
-	sf.cl = NewClientBusHttp(baseUrl).Hassert("newGood1()").(*ClientBusHttp)
-	resServ := kserv_http.GetKernelServHttp()
-	kServHttp := resServ.Hassert("newGood1()")
+	sf.kCtx.Set("monolitName", "test_client_bus_http", "comment")
+	sf.cl = NewClientBusHttp(baseUrl).(*ClientBusHttp)
+	kServHttp := kserv_http.GetKernelServHttp()
 	kServHttp.Run()
 
 	if log := sf.cl.Log(); log == nil {
@@ -404,17 +404,11 @@ func (sf *tester) newGood1() {
 // Пустой URL.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2")
-	res := NewClientBusHttp("")
-	if res.IsOk() {
-		sf.t.Fatalf("newBad2(): err==nil")
-	}
+	_= NewClientBusHttp("")
 }
 
 // Нет ничего для HTTP-шины.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	res := NewClientBusHttp("url")
-	if res.IsOk() {
-		sf.t.Fatalf("newBad1(): err==nil")
-	}
+	_ = NewClientBusHttp("url")
 }

+ 12 - 31
v4/lev2/kbus_http/kbus_http.go

@@ -8,7 +8,6 @@ import (
 
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
@@ -33,47 +32,29 @@ var (
 )
 
 // GetKernelBusHttp -- возвращает шину HTTP.
-func GetKernelBusHttp() *mL0.Result[mKt.IKernelBus] {
+func GetKernelBusHttp() mKt.IKernelBus {
 	block.Lock()
 	defer block.Unlock()
 	if Bus_ != nil {
-		return mL0.NewRes(mKt.IKernelBus(Bus_))
+		return Bus_
 	}
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("kBusHttp"))
 	log.Debug("GetKernelBusHttp(): new")
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resKernCtx.Err())
-		return mL0.NewErr[mKt.IKernelBus](err)
-	}
-	kCtx := resKernCtx.Val()
-	resBus := kbus_base.GetKernelBusBase()
-	if resBus.IsErr() {
-		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resBus.Err())
-		return mL0.NewErr[mKt.IKernelBus](err)
-	}
+	kCtx := kctx.GetKernelCtx()
+	kBus := kbus_base.GetKernelBusBase()
 	sf := &kBusHttp{
-		KBusBase: resBus.Val(),
+		KBusBase: kBus,
 		log:      log,
 	}
-	resServ := kserv_http.GetKernelServHttp()
-	if resServ.IsErr() {
-		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resServ.Err())
-		return mL0.NewErr[mKt.IKernelBus](err)
-	}
-	serv := resServ.Val()
-	fibApp := serv.Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	fibApp.Post("/bus/sub", sf.postSub)             // Топик подписки, IN
 	fibApp.Post("/bus/unsub", sf.postUnsub)         // Топик отписки, IN
 	fibApp.Post("/bus/request", sf.postSendRequest) // Топик входящих запросов, IN
 	fibApp.Post("/bus/pub", sf.postPublish)         // Топик публикаций подписки, IN
-	resSet := kCtx.Set("kernBus", sf, "GetKernelBusHttp(): http data bus")
-	if resSet.IsErr() {
-		sf.log.Err("GetKernelBusHttp(): err=\n\t%v", resSet.Err())
-		return mL0.NewErr[mKt.IKernelBus](resSet.Err())
-	}
+	kCtx.Set("kernBus", sf, "GetKernelBusHttp(): http data bus")
 	Bus_ = sf
-	return mL0.NewRes(mKt.IKernelBus(Bus_))
+	return Bus_
 }
 
 // Входящий запрос HTTP на подписку.
@@ -190,7 +171,7 @@ func (sf *kBusHttp) processSendRequest(req *msg_serve.ServeReq) *msg_serve.Serve
 		resp.Status_ = fmt.Sprintf("kernelBusHttp.processSendRequest(): err=\n\t%v", res.Err())
 		return resp
 	}
-	resp.BinResp_ = res.Val()
+	resp.BinResp_ = res.Ok()
 	return resp
 }
 
@@ -224,7 +205,7 @@ func (sf *kBusHttp) processUnsubRequest(req *msg_unsub.UnsubReq) *msg_unsub.Unsu
 		Status_: "ok",
 		Uuid_:   req.Uuid_,
 	}
-	optHandler := sf.Ctx_.Get(req.Name_.Get())
+	optHandler := sf.KCtx_.Get(req.Name_.Get())
 	if optHandler.IsNone() {
 		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
 			req.Name_)
@@ -234,7 +215,7 @@ func (sf *kBusHttp) processUnsubRequest(req *msg_unsub.UnsubReq) *msg_unsub.Unsu
 		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): handler(%v) not exists", req.Name_)
 		return resp
 	}
-	hand := optHandler.Val().Val().(mKt.IBusHandlerSubscribe)
+	hand := optHandler.Some().Val().(mKt.IBusHandlerSubscribe)
 	sf.Unsubscribe(hand)
 	return resp
 }

+ 22 - 22
v4/lev2/kbus_http/kbus_http_test.go

@@ -37,8 +37,8 @@ func TestKernelBusHttp(t *testing.T) {
 		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, "http://localhost:18200/bus/pub"),
 		handServ: mock_hand_serve.NewMockHandlerServe(qNameServ, "name_serv"),
 	}
-	ctx := kctx.GetKernelCtx().Hassert("TestKernelBusHttp()")
-	ctx.Set("monolitName", "test_monolit", "comment").Hassert("TestKernelBusHttp()")
+	ctx := kctx.GetKernelCtx()
+	ctx.Set("monolitName", "test_monolit", "comment")
 	sf.get()
 	sf.req()
 	sf.sub()
@@ -68,8 +68,8 @@ func (sf *tester) unsubGood2() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("unsubGood2").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/unsub", body)
 	if err != nil {
 		sf.t.Fatalf("unsubGood2(): err=%v", err)
@@ -103,8 +103,8 @@ func (sf *tester) unsubBad3() {
 	req := "tra-la-la"
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("unsubBad3").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/unsub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -193,8 +193,8 @@ func (sf *tester) pubGood2() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("pubGood2").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/pub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -227,8 +227,8 @@ func (sf *tester) pubBad3() {
 	req := "tra-la-la"
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("pubBad3").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/pub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -321,8 +321,8 @@ func (sf *tester) subGood2() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("subGood2").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/sub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -411,8 +411,8 @@ func (sf *tester) subBad1() {
 	req := "tra-ta-ta"
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("subBad1").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/sub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -452,8 +452,8 @@ func (sf *tester) reqBad4() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("reqBad4").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -489,8 +489,8 @@ func (sf *tester) reqGood1() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("reqGood1").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -531,8 +531,8 @@ func (sf *tester) reqBad3() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("reqBad3").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
 	if err != nil {
 		sf.t.Fatalf("reqBad3(): err=%v", err)
@@ -553,8 +553,8 @@ func (sf *tester) reqBad3() {
 func (sf *tester) reqBad2() {
 	sf.t.Log("reqBad1")
 	body := strings.NewReader("test_msg")
-	resServ := kserv_http.GetKernelServHttp()
-	fibApp := resServ.Hassert("reqBad2").Fiber()
+	kServHttp := kserv_http.GetKernelServHttp()
+	fibApp := kServHttp.Fiber()
 	hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
 	if err != nil {
 		sf.t.Fatalf("reqBad1(): err=%v", err)

+ 3 - 11
v4/lev2/kbus_local/client_bus_local/client_bus_local.go

@@ -2,9 +2,6 @@
 package client_bus_local
 
 import (
-	"fmt"
-
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
 )
@@ -15,14 +12,9 @@ type ClientBusLocal struct {
 }
 
 // NewClientBusLocal -- клиент локальной шины.
-func NewClientBusLocal() *mL0.Result[mKt.IBusClient] {
-	resLocal := kbus_local.GetKernelBusLocal()
-	if resLocal.IsErr() {
-		err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", resLocal.Err())
-		return mL0.NewErr[mKt.IBusClient](err)
-	}
+func NewClientBusLocal() mKt.IBusClient {
 	sf := &ClientBusLocal{
-		IKernelBus: resLocal.Val(),
+		IKernelBus: kbus_local.GetKernelBusLocal(),
 	}
-	return mL0.NewRes(mKt.IBusClient(sf))
+	return sf
 }

+ 4 - 4
v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go

@@ -9,7 +9,7 @@ import (
 
 type tester struct {
 	t  *testing.T
-	cl IBusClient
+	lClient IBusClient
 }
 
 func TestClientBusLocal(t *testing.T) {
@@ -26,11 +26,11 @@ var (
 // Создание нового клиента.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.cl = NewClientBusLocal().Hassert("new()")
-	if sf.cl == nil {
+	sf.lClient = NewClientBusLocal()
+	if sf.lClient == nil {
 		sf.t.Fatalf("new(): client==nil")
 	}
-	res := sf.cl.Publish(qTopicLocal, []byte("test_msg"))
+	res := sf.lClient.Publish(qTopicLocal, []byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("new(): err=%v", res.Err())
 	}

+ 8 - 11
v4/lev2/kbus_local/kbus_local.go

@@ -2,9 +2,8 @@
 package kbus_local
 
 import (
-	"fmt"
+	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
 )
 
@@ -15,20 +14,18 @@ type kernelBusLocal struct {
 
 var (
 	bus *kernelBusLocal
+	block sync.Mutex
 )
 
 // GetKernelBusLocal -- возвращает локальную шину сообщений.
-func GetKernelBusLocal() *mL0.Result[*kernelBusLocal] {
+func GetKernelBusLocal() *kernelBusLocal {
+	block.Lock()
+	defer block.Unlock()
 	if bus != nil {
-		return mL0.NewRes(bus)
-	}
-	resBus := kbus_base.GetKernelBusBase()
-	if resBus.IsErr() {
-		err := fmt.Errorf("GetKernelBusLocal(): in get kernel bus base, err=\n\t%w", resBus.Err())
-		return mL0.NewErr[*kernelBusLocal](err)
+		return bus
 	}
 	bus = &kernelBusLocal{
-		KBusBase: resBus.Val(),
+		KBusBase: kbus_base.GetKernelBusBase(),
 	}
-	return mL0.NewRes(bus)
+	return bus
 }

+ 5 - 5
v4/lev2/kbus_local/kbus_local_test.go

@@ -11,7 +11,7 @@ import (
 
 type tester struct {
 	t        *testing.T
-	bus      IKernelBus
+	lBus      IKernelBus
 	handSub  *mock_hand_sub_local.MockHandlerSub
 	handServ *mock_hand_serve.MockHandlerServe
 }
@@ -44,12 +44,12 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.bus = GetKernelBusLocal().Hassert("newGood1()")
-	sf.bus = GetKernelBusLocal().Hassert("newGood1()")
-	if sf.bus == nil {
+	sf.lBus = GetKernelBusLocal()
+	sf.lBus = GetKernelBusLocal()
+	if sf.lBus == nil {
 		sf.t.Fatalf("newGood1(): IKernelBus==nil")
 	}
-	if !sf.bus.IsWork() {
+	if !sf.lBus.IsWork() {
 		sf.t.Fatalf("newGood1(): bus not work")
 	}
 }

+ 7 - 17
v4/lev2/kctx/kctx.go

@@ -3,10 +3,8 @@ package kctx
 
 import (
 	"context"
-	"fmt"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kernel_keeper"
@@ -30,11 +28,11 @@ var (
 )
 
 // GetKernelCtx -- возвращает контекст ядра.
-func GetKernelCtx() *mL0.Result[*kCtx] {
+func GetKernelCtx() mKt.IKernelCtx {
 	block.Lock()
 	defer block.Unlock()
 	if kernCtx != nil {
-		return mL0.NewRes(kernCtx)
+		return kernCtx
 	}
 	ctxBg := context.Background()
 	ctx, fnCancel := context.WithCancel(ctxBg)
@@ -43,22 +41,14 @@ func GetKernelCtx() *mL0.Result[*kCtx] {
 		ctx:      ctx,
 		fnCancel: fnCancel,
 	}
-	resLocal := mL1.NewLocalCtx(sf.ctx)
-	if resLocal.IsErr() {
-		err := fmt.Errorf("GetKernelCtx(): in get local ctx, err=\n\t%w", resLocal.Err())
-		return mL0.NewErr[*kCtx](err)
-	}
-	sf.ILocalCtx = resLocal.Val()
+	lCtx := mL1.NewLocalCtx(sf.ctx)
+	sf.ILocalCtx = lCtx
 	sf.log = sf.Log()
 	sf.kernWg = kwg.GetKernelWg(sf.ctx)
-	resKeep := kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
-	if resKeep.IsErr() {
-		sf.log.Err("GetKernelCtx(): in get kernel keeper, err=\n\t%w", resKeep.Err())
-		return nil
-	}
-	sf.kernKeeper = resKeep.Val()
+	kKeep := kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
+	sf.kernKeeper = kKeep
 	kernCtx = sf
-	return mL0.NewRes(kernCtx)
+	return kernCtx
 }
 
 // Keeper -- возвращает сторож системных сигналов.

+ 14 - 14
v4/lev2/kctx/kctx_test.go

@@ -18,37 +18,37 @@ func TestKernelCtx(t *testing.T) {
 // Создание контекста ядра.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	ctx := GetKernelCtx().Hassert("new()")
-	if ctx == nil {
+	kCtx := GetKernelCtx()
+	if kCtx == nil {
 		sf.t.Fatalf("new(): KernelCtx==nil")
 	}
-	if ctx := ctx.CtxBg(); ctx != kernCtx.ctxBg {
+	if ctx := kCtx.CtxBg(); ctx != kernCtx.ctxBg {
 		sf.t.Fatalf("new(): ctx!=ctxBg")
 	}
-	if ctx := ctx.Ctx(); ctx == nil {
+	if ctx := kCtx.Ctx(); ctx == nil {
 		sf.t.Fatalf("new(): ctx==nil")
 	}
-	ctx.Set("counter", 5, "test_counter").Hassert("new()")
-	if ctx.Get("counter") == nil {
+	kCtx.Set("counter", 5, "test_counter")
+	if kCtx.Get("counter") == nil {
 		sf.t.Fatalf("new(): counter==nil")
 	}
-	res := ctx.Get("counter")
+	res := kCtx.Get("counter")
 	ctxVal := res.Hassert("new()")
 	val := ctxVal.Val().(int)
 	if val != 5 {
 		sf.t.Fatalf("new(): counter(%v)!=5", val)
 	}
-	ctx.Del("counter")
-	ctx.Cancel()
-	ctx.Wait()
-	ctx = GetKernelCtx().Hassert("new()")
-	if ctx == nil {
+	kCtx.Del("counter")
+	kCtx.Cancel()
+	kCtx.Wait()
+	kCtx = GetKernelCtx()
+	if kCtx == nil {
 		sf.t.Fatalf("new(): KernelCtx==nil")
 	}
-	if wg := ctx.Wg(); wg == nil {
+	if wg := kCtx.Wg(); wg == nil {
 		sf.t.Fatalf("new(): IKernelWg==nil")
 	}
-	if keep := ctx.Keeper(); keep == nil {
+	if keep := kCtx.Keeper(); keep == nil {
 		sf.t.Fatalf("new(): IKernelKeeper==nil")
 	}
 

+ 7 - 18
v4/lev2/kernel_keeper/kernel_keeper.go

@@ -3,7 +3,6 @@ package kernel_keeper
 
 import (
 	"context"
-	"fmt"
 	"os"
 	"os/signal"
 	"sync"
@@ -32,25 +31,16 @@ var (
 
 // GetKernelKeeper -- возвращает новый сторож системных сигналов.
 func GetKernelKeeper(ctx context.Context, fnCancel func(),
-	wg mKt.IKernelWg) *mL0.Result[*kernelKeeper] {
+	wg mKt.IKernelWg) *kernelKeeper {
 	block.Lock()
 	defer block.Unlock()
 	if kernKeep != nil {
 		kernKeep.log.Debug("GetKernelKeeper()")
-		return mL0.NewRes(kernKeep)
-	}
-	if ctx == nil {
-		err := fmt.Errorf("NewKernelCtx(): ctx==nil")
-		return mL0.NewErr[*kernelKeeper](err)
-	}
-	if wg == nil {
-		err := fmt.Errorf("NewKernelCtx(): IKernelWg==nil")
-		return mL0.NewErr[*kernelKeeper](err)
-	}
-	if fnCancel == nil {
-		err := fmt.Errorf("NewKernelCtx(): fnCancel==nil")
-		return mL0.NewErr[*kernelKeeper](err)
+		return kernKeep
 	}
+	mL0.Hassert(ctx!=nil,"NewKernelCtx(): ctx==nil")
+	mL0.Hassert(wg!=nil, "NewKernelCtx(): IKernelWg==nil")
+	mL0.Hassert(fnCancel!=nil, "NewKernelCtx(): fnCancel==nil")
 	sf := &kernelKeeper{
 		ctx:      ctx,
 		fnCancel: fnCancel,
@@ -59,13 +49,12 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 		chSys_:   make(chan os.Signal, 2),
 	}
 	sf.log.Debug("GetKernelKeeper(): first run")
-	res := sf.wg.Add(qName)
-	res.Hassert("NewKernelCtx(): in add stream kernel keeper in IKernelWg")
+	sf.wg.Add(qName)
 
 	go sf.run(sf.chSys_)
 	kernKeep = sf
 	_ = mKt.IKernelKeeper(sf)
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Log -- возвращает лог сторожа системных сигналов.

+ 1 - 1
v4/lev2/kernel_keeper/kernel_keeper_test.go

@@ -64,7 +64,7 @@ func (sf *tester) get2() {
 // Получает сторож ядра.
 func (sf *tester) get() {
 	sf.t.Log("get")
-	keep := GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg).Hassert("get()")
+	keep := GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg)
 	if keep == nil {
 		sf.t.Fatalf("get(): IKernelKeeper==nil")
 	}

+ 6 - 22
v4/lev2/kmodule/kmodule.go

@@ -2,7 +2,6 @@
 package kmodule
 
 import (
-	"fmt"
 	"time"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -28,35 +27,20 @@ type kModule struct {
 }
 
 // NewKernelModule -- возвращает новый модуль на основе ядра.
-func NewKernelModule(name *mKa.AModuleName) *mL0.Result[mKt.IKernelModule] {
+func NewKernelModule(name *mKa.AModuleName) mKt.IKernelModule {
 	mL0.Hassert(name != nil, "NewKernelModule(): name==nil")
-	resCtx := kctx.GetKernelCtx()
-	if resCtx.IsErr() {
-		err := fmt.Errorf("NewKernelModule(): in get kernel ctx,err=%v", resCtx.Err())
-		return mL0.NewErr[mKt.IKernelModule](err)
-	}
-	kCtx := resCtx.Val()
-	resLocal := kbus_local.GetKernelBusLocal()
-	if resLocal.IsErr() {
-		err := fmt.Errorf("NewKernelModule(): in get kernel bus local,err=%v", resLocal.Err())
-		return mL0.NewErr[mKt.IKernelModule](err)
-	}
-	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
-	if resLocCtx.IsErr() {
-		err := fmt.Errorf("NewKernelModule(): in new local ctx,err=%v", resLocCtx.Err())
-		return mL0.NewErr[mKt.IKernelModule](err)
-	}
+	kCtx := kctx.GetKernelCtx()
 	sf := &kModule{
 		kCtx:      kCtx,
-		ctx:       resLocCtx.Val(),
+		ctx:       mL1.NewLocalCtx(kCtx.Ctx()),
 		name:      name,
-		bus:       resLocal.Val(),
+		bus:       kbus_local.GetKernelBusLocal(),
 		timePhase: mL1.NewSafeInt(1000), // 1000 msec
 		strLive:   mL1.NewSafeString(),
 		stat:      mod_stat.NewModStat(name),
 	}
 	go sf.sigLive()
-	return mL0.NewRes(mKt.IKernelModule(sf))
+	return sf
 }
 
 // Stat -- возвращает статистику модуля.
@@ -100,7 +84,7 @@ func (sf *kModule) sigLive() {
 	var (
 		topic  = alias.NewATopic(sf.name.Get() + "_live")
 		iPhase = 0
-		res    *mL0.Result[bool]
+		res    mL0.IResult[bool]
 	)
 	fnPhase := func() {
 		time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))

+ 2 - 2
v4/lev2/kmodule/kmodule_test.go

@@ -41,7 +41,7 @@ func TestKernelModule(t *testing.T) {
 // Работа после остановки локальной шины.
 func (sf *tester) done() {
 	sf.t.Log("done")
-	kCtx := kctx.GetKernelCtx().Hassert("done()")
+	kCtx := kctx.GetKernelCtx()
 
 	time.Sleep(time.Millisecond * 250)
 	kCtx.Cancel()
@@ -82,7 +82,7 @@ func (sf *tester) new() {
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
 	modName := alias.NewAModuleName("test_module")
-	sf.mod = NewKernelModule(modName).Hassert("newGood1()")
+	sf.mod = NewKernelModule(modName)
 	if name := sf.mod.Name(); name.Get() != "test_module" {
 		sf.t.Fatalf("newGood1(): name(%v)!='test_module'", name)
 	}

+ 18 - 45
v4/lev2/kmonolit/kmonolit.go

@@ -3,6 +3,7 @@ package kmonolit
 
 import (
 	"fmt"
+	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
@@ -26,33 +27,23 @@ type kMonolit struct {
 
 var (
 	mon *kMonolit
+	block sync.Mutex
 )
 
 // GetMonolit -- возвращает монолит.
-func GetMonolit(name string) *mL0.Result[*kMonolit] {
+func GetMonolit(name string) *kMonolit {
+	block.Lock()
+	defer block.Unlock()
 	if mon != nil {
-		return mL0.NewRes(mon)
+		return mon
 	}
 	mKh.Hassert(name != "", "NewMonolit(): name is empty")
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetMonolit(): err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*kMonolit](err)
-	}
-	kCtx := resKernCtx.Val()
-	res := kCtx.Get("isLocal")
-	if res.IsNone() {
-		err := fmt.Errorf("GetMonolit(): in get from kernCtx isLocal -- not found")
-		return mL0.NewErr[*kMonolit](err)
-	}
-	isLocalCtx := res.Val()
+	kCtx := kctx.GetKernelCtx()
+	opt := kCtx.Get("isLocal")
+	opt.Hassert("GetMonolit(): in get from kernCtx isLocal -- not found")
+	isLocalCtx := opt.Some()
 	isLocal := isLocalCtx.Val().(bool)
-	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
-	if resLocCtx.IsErr() {
-		err := fmt.Errorf("GetMonolit(): in new local_ctx, err=\n\t%w", resLocCtx.Err())
-		return mL0.NewErr[*kMonolit](err)
-	}
-	lCtx := resLocCtx.Val()
+	lCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	sf := &kMonolit{
 		kCtx:    kCtx,
 		lCtx:    lCtx,
@@ -63,19 +54,11 @@ func GetMonolit(name string) *mL0.Result[*kMonolit] {
 		isLocal: isLocal,
 	}
 	sf.log = sf.lCtx.Log()
-	resSet := sf.kCtx.Set("monolitName", name, "name of monolit")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetMonolit(): in set to kernCtx monolitName, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[*kMonolit](err)
-	}
-	resSet = sf.kCtx.Set("monolit", sf, "monolit-app")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetMonolit(): in set to kernCtx monolit-app, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[*kMonolit](err)
-	}
+	sf.kCtx.Set("monolitName", name, "name of monolit")
+	sf.kCtx.Set("monolit", sf, "monolit-app")
 	mon = sf
 	_ = mKt.IKernelMonolit(sf)
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Ctx -- возвращает контекст монолита.
@@ -94,17 +77,12 @@ func (sf *kMonolit) Name() string {
 }
 
 // Add -- добавляет модуль в монолит.
-func (sf *kMonolit) Add(module mKt.IKernelModule) *mL0.Result[bool] {
+func (sf *kMonolit) Add(module mKt.IKernelModule)  {
 	sf.kCtx.RLock()
 	defer sf.kCtx.RUnlock()
-	if module == nil {
-		return mL0.NewErr[bool](fmt.Errorf("kMonolit.Add(): module==nil"))
-	}
+	mL0.Hassert(module!=nil, "kMonolit.Add(): module==nil")
 	_, isOk := sf.dict[module.Name()]
-	if isOk {
-		err := fmt.Errorf("kMonolit.Add(): module(%v) already exists", module.Name())
-		return mL0.NewErr[bool](err)
-	}
+	mL0.Hassert(!isOk, "kMonolit.Add(): module(%v) already exists", module.Name())
 	sf.dict[module.Name()] = module
 	sf.log.Debug("kMonolit.Add(): module='%v'", module.Name())
 	if sf.isWork.Get() {
@@ -113,12 +91,7 @@ func (sf *kMonolit) Add(module mKt.IKernelModule) *mL0.Result[bool] {
 	}
 	key := fmt.Sprintf("module_%v", len(sf.dict))
 	moduleName := module.Name()
-	resSet := sf.lCtx.Set(key, module, "kMonolit.Add(): module="+moduleName.Get())
-	if resSet.IsErr() {
-		err := fmt.Errorf("kMonolit.Add(): in set module(%v) to kernel ctx, err=\n\t%w", moduleName, resSet.Err())
-		return mL0.NewErr[bool](err)
-	}
-	return mL0.NewRes(true)
+	sf.lCtx.Set(key, module, "kMonolit.Add(): module="+moduleName.Get())
 }
 
 // Run -- запускает монолит в работу.

+ 12 - 17
v4/lev2/kmonolit/kmonolit_test.go

@@ -46,9 +46,9 @@ func TestKernMono(t *testing.T) {
 
 func (sf *tester) done() {
 	sf.t.Log("done")
-	ctx := kctx.GetKernelCtx().Hassert("done()")
-	ctx.Cancel()
-	ctx.Wg().Wait()
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Cancel()
+	kCtx.Wg().Wait()
 	sf.mon.Run()
 	sf.mon.Wait()
 	sf.mon.Run()
@@ -66,7 +66,7 @@ type mod struct {
 
 func newMod(name *AModuleName) IKernelModule {
 	sf := &mod{
-		IKernelModule: kmodule.NewKernelModule(name).Hassert("newMod()"),
+		IKernelModule: kmodule.NewKernelModule(name),
 	}
 	return sf
 }
@@ -77,14 +77,14 @@ func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
 	modName := alias.NewAModuleName("test_module")
 	mod := newMod(modName)
-	sf.mon.Add(mod).Hassert("addGood1()")
+	sf.mon.Add(mod)
 }
 
 func (sf *tester) run() {
 	sf.t.Log("run")
 	modName := alias.NewAModuleName("test_mod1")
 	mod := newMod(modName)
-	sf.mon.Add(mod).Hassert("run()")
+	sf.mon.Add(mod)
 	sf.mon.Run()
 	isWork := sf.mon.IsWork()
 	if !isWork {
@@ -106,16 +106,15 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	ctx := kctx.GetKernelCtx().Hassert("newGood1()")
-	ctx.Set("isLocal", true, "type bus").Hassert("newGood1()")
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Set("isLocal", true, "type bus")
 	for {
 		SleepMs()
-		if ctx.Get("isLocal") != nil {
+		if kCtx.Get("isLocal") != nil {
 			break
 		}
 	}
-	resMon := GetMonolit("test_monolit")
-	sf.mon = resMon.Hassert("newGood1()")
+	sf.mon = GetMonolit("test_monolit")
 	isLocal := sf.mon.IsLocal()
 	if !isLocal {
 		sf.t.Fatalf("newGood1(): isLocal==false")
@@ -129,15 +128,11 @@ func (sf *tester) newGood1() {
 	if ctx := sf.mon.Ctx(); ctx == nil {
 		sf.t.Fatalf("newGood1(): ctx==nil")
 	}
-	resMon = GetMonolit("")
-	sf.mon = resMon.Hassert("newGood1()")
+	sf.mon = GetMonolit("")
 }
 
 // Нет признака локальности.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	res := GetMonolit("test_32")
-	if res.IsOk() {
-		sf.t.Fatalf("newBad1(): res.IsOk()==true")
-	}
+	_= GetMonolit("test_32")
 }

+ 10 - 30
v4/lev2/kserv_http/kserv_http.go

@@ -15,7 +15,6 @@ import (
 	"github.com/gofiber/fiber/v2/middleware/monitor"
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
@@ -53,28 +52,23 @@ func getParams() (string, mKt.ILogBuf, mKt.IKernelCtx) {
 	log.Debug("GetKernelServHttp(): first run")
 	strLocalUrl := os.Getenv("LOCAL_HTTP_URL")
 	hassert(strLocalUrl != "", "getParams(): env LOCAL_HTTP_URL not set")
-	resKernCtx := kctx.GetKernelCtx()
-	resKernCtx.Hassert("getParams(): in get KernelCtx")
-	kCtx := resKernCtx.Val()
+	kCtx := kctx.GetKernelCtx()
 	return strLocalUrl, log, kCtx
 }
 
 // GetKernelServHttp -- возвращает  встроенный HTTP-сервер.
-func GetKernelServHttp() *mL0.Result[mKt.IKernelServerHttp] {
+func GetKernelServHttp() mKt.IKernelServerHttp {
 	block.Lock()
 	defer block.Unlock()
 	if kernServHttp != nil {
 		kernServHttp.log.Debug("GetKernelServHttp()")
-		return mL0.NewRes(mKt.IKernelServerHttp(kernServHttp))
+		return kernServHttp
 	}
 	strLocalUrl, log, kCtx := getParams()
 
 	optMonolit := kCtx.Get("monolitName")
-	if optMonolit.IsNone() {
-		err := fmt.Errorf("GetKernelServHttp(): not have monolit name from kCtx")
-		return mL0.NewErr[mKt.IKernelServerHttp](err)
-	}
-	strMonolit := optMonolit.Val().Val().(string)
+	optMonolit.Hassert("GetKernelServHttp(): not have monolit name from kCtx")
+	strMonolit := optMonolit.Some().Val().(string)
 	confFiber := fiber.Config{
 		ServerHeader: strMonolit,
 		UnescapePath: true,
@@ -82,15 +76,10 @@ func GetKernelServHttp() *mL0.Result[mKt.IKernelServerHttp] {
 		WriteTimeout: time.Second * 15,
 		AppName:      strMonolit,
 	}
-	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
-	if resLocCtx.IsErr() {
-		err := fmt.Errorf("GetKernelServHttp(): in get LocalCtx, err=\n\t%w", resLocCtx.Err())
-		return mL0.NewErr[mKt.IKernelServerHttp](err)
-	}
 	sf := &kServHttp{
 		kCtx:     kCtx,
 		log:      log,
-		lCtx:     resLocCtx.Val(),
+		lCtx:     mL1.NewLocalCtx(kCtx.Ctx()),
 		strUrl:   strLocalUrl,
 		fiberApp: fiber.New(confFiber),
 		isWork:   mL1.NewSafeBool(),
@@ -106,20 +95,11 @@ func GetKernelServHttp() *mL0.Result[mKt.IKernelServerHttp] {
 		MaxAge:     3600 * 24,
 	}))
 	sf.fiberApp.Get("/monitor", monitor.New(monitor.Config{Title: strMonolit}))
-	res1 := sf.kCtx.Wg().Add(streamName)
-	res1.Hassert("GetKernelServHttp(): in add stream %v", streamName)
-	resSet := kCtx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetKernelServHttp(): in set fiber app, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[mKt.IKernelServerHttp](err)
-	}
+	sf.kCtx.Wg().Add(streamName)
+	kCtx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
 	kernServHttp = sf
-	resSet = kCtx.Set("kServHttp", kernServHttp, "kServHttp")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetKernelServHttp(): in set kernServHttp, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[mKt.IKernelServerHttp](err)
-	}
-	return mL0.NewRes(mKt.IKernelServerHttp(kernServHttp))
+	kCtx.Set("kServHttp", kernServHttp, "kServHttp")
+	return kernServHttp
 }
 
 // IsWork -- возвращает признак работы.

+ 10 - 16
v4/lev2/kserv_http/kserv_http_test.go

@@ -16,17 +16,17 @@ const (
 
 type tester struct {
 	t   *testing.T
-	ctx IKernelCtx
+	kCtx IKernelCtx
 	wg  IKernelWg
 	me  *mock_env.MockEnv
 }
 
 func TestKernelServHttp(t *testing.T) {
-	ctx := kctx.GetKernelCtx().Hassert("TestKernelServHttp()")
+	kCtx := kctx.GetKernelCtx()
 	sf := &tester{
 		t:   t,
-		ctx: ctx,
-		wg:  ctx.Wg(),
+		kCtx: kCtx,
+		wg:  kCtx.Wg(),
 	}
 	sf.new()
 	sf.close()
@@ -35,7 +35,7 @@ func TestKernelServHttp(t *testing.T) {
 // Закрытие HTTP-сервера.
 func (sf *tester) close() {
 	sf.t.Log("close")
-	sf.ctx.Cancel()
+	sf.kCtx.Cancel()
 	sf.wg.Wait()
 	kernServHttp.close()
 	if kernServHttp.IsWork() {
@@ -60,7 +60,7 @@ func (sf *tester) new() {
 // Повторный запуск сервера на том же порту.
 func (sf *tester) newBad3() {
 	sf.t.Log("newBad3()")
-	serv := GetKernelServHttp().Hassert("newBad1")
+	serv := GetKernelServHttp()
 	go serv.Run()
 	count := 0
 	for count < 20 {
@@ -79,8 +79,8 @@ func (sf *tester) newGood1() {
 	sf.me = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", baseUrl)
-	sf.ctx.Set("monolitName", "test_monolit", "comment").Hassert("newGood1()")
-	serv := GetKernelServHttp().Hassert("newGood1()").(*kServHttp)
+	sf.kCtx.Set("monolitName", "test_monolit", "comment")
+	serv := GetKernelServHttp().(*kServHttp)
 	if serv != kernServHttp {
 		sf.t.Fatalf("newGood1(): bad IKernelServHttp")
 	}
@@ -102,17 +102,11 @@ func (sf *tester) newGood1() {
 // Не указана SERVER_HTTP_PORT.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2()")
-	res := GetKernelServHttp()
-	if res.IsOk() {
-		sf.t.Fatalf("newBad2(): res.IsOk()==true")
-	}
+	_= GetKernelServHttp()
 }
 
 // Нет контекста ядра.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1()")
-	res := GetKernelServHttp()
-	if res.IsOk() {
-		sf.t.Fatalf("newBad1(): res.IsOk()==true")
-	}
+	_= GetKernelServHttp()
 }

+ 3 - 9
v4/lev2/kserv_http_std/kserv_http_std.go

@@ -27,7 +27,7 @@ var (
 )
 
 // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
-func GetKservHttpStd() *mL0.Result[*kServHttpStd] {
+func GetKservHttpStd() mL0.IResult[*kServHttpStd] {
 	mu.Lock()
 	defer mu.Unlock()
 	if kServ != nil {
@@ -37,16 +37,10 @@ func GetKservHttpStd() *mL0.Result[*kServHttpStd] {
 	log.Debug("GetKservHttpStd()")
 	resPort := mL1.NewSafeIntGetenv("SERV_HTTP_STD_PORT")
 	resPort.Hassert("in get env SERV_HTTP_STD_PORT")
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetKservHttpStd(): in get KernelCtx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*kServHttpStd](err)
-	}
-	kCtx := resKernCtx.Val()
 	sf := &kServHttpStd{
-		kCtx: kCtx,
+		kCtx: kctx.GetKernelCtx(),
 		log:  log,
-		port: resPort.Val().Get(),
+		port: resPort.Ok().Get(),
 	}
 	kServ = sf
 	return mL0.NewRes(sf)

+ 13 - 28
v4/lev2/kstore_kv/kstore_kv.go

@@ -34,45 +34,31 @@ type kStoreKv struct {
 }
 
 var (
-	kernStore *kStoreKv // Глобальный объект
-	block     sync.Mutex
+	kernStore       *kStoreKv // Глобальный объект
+	block           sync.Mutex
 )
 
 // GetKernelStore -- возвращает новое локальное хранилище ядра.
-func GetKernelStore() *mL0.Result[*kStoreKv] {
+func GetKernelStore() mKt.IKernelStoreKv {
 	block.Lock()
 	defer block.Unlock()
 	if kernStore != nil {
 		kernStore.log.Debug("GetKernelStore()")
-		return mL0.NewRes(kernStore)
+		return kernStore
 	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetKernelStore(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*kStoreKv](err)
-	}
-	kCtx := resKernCtx.Val()
+	kCtx := kctx.GetKernelCtx()
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("kStoreKv"))
-	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
-	if resLocCtx.IsErr() {
-		err := fmt.Errorf("GetKernelStore(): in get local ctx, err=\n\t%w", resLocCtx.Err())
-		return mL0.NewErr[*kStoreKv](err)
-	}
 	sf := &kStoreKv{
 		kCtx:   kCtx,
-		lCtx:   resLocCtx.Val(),
+		lCtx:   mL1.NewLocalCtx(kCtx.Ctx()),
 		wg:     kCtx.Wg(),
 		isWork: mL1.NewSafeBool(),
 		log:    log,
 	}
 	sf.open()
 	kernStore = sf
-	resSet := kCtx.Set("kernStoreKV", kernStore, "fast KV store on Badger")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetKernelStore(): in set kernel store KV to kernel ctx, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[*kStoreKv](err)
-	}
-	return mL0.NewRes(kernStore)
+	kCtx.Set("kernStoreKV", kernStore, "fast KV store on Badger")
+	return kernStore
 }
 
 // Log -- возвращает локальный лог.
@@ -81,7 +67,7 @@ func (sf *kStoreKv) Log() mKt.ILogBuf {
 }
 
 // Set -- устанавливает значение по ключу.
-func (sf *kStoreKv) Set(key string, val []byte) *mL0.Result[bool] {
+func (sf *kStoreKv) Set(key string, val []byte) mL0.IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Set(): key='%v'", key)
@@ -99,7 +85,7 @@ func (sf *kStoreKv) Set(key string, val []byte) *mL0.Result[bool] {
 }
 
 // Get -- возвращает значение по ключу.
-func (sf *kStoreKv) Get(key string) *mL0.Result[[]byte] {
+func (sf *kStoreKv) Get(key string) mL0.IResult[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	sf.log.Debug("Get(): key='%v'", key)
@@ -122,7 +108,7 @@ func (sf *kStoreKv) Get(key string) *mL0.Result[[]byte] {
 }
 
 // ByPrefix -- фильтрует ключи по префиксу.
-func (sf *kStoreKv) ByPrefix(prefix string) *mL0.Result[[]string] {
+func (sf *kStoreKv) ByPrefix(prefix string) mL0.IResult[[]string] {
 	var (
 		binKey []byte
 		lstKey = []string{}
@@ -155,7 +141,7 @@ func (sf *kStoreKv) ByPrefix(prefix string) *mL0.Result[[]string] {
 }
 
 // Delete -- удалить ключ из хранилища.
-func (sf *kStoreKv) Delete(key string) *mL0.Result[bool] {
+func (sf *kStoreKv) Delete(key string) mL0.IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Delete(): key='%v'", key)
@@ -186,8 +172,7 @@ func (sf *kStoreKv) open() {
 	mKh.Hassert(err == nil, "open(): in make dir %v, err=\n\t%v", sf.storePath, err)
 	sf.db, err = badger.Open(badger.DefaultOptions(sf.storePath))
 	mKh.Hassert(err == nil, "open(): in open DB %v, err=\n\t%v", sf.storePath, err)
-	res := sf.wg.Add(storeStreamName)
-	res.Hassert("open(): in add name stream to IKernelWg")
+	sf.wg.Add(storeStreamName)
 	sf.isWork.Set()
 	go sf.close()
 	go sf.clean()

+ 10 - 13
v4/lev2/kstore_kv/kstore_kv_test.go

@@ -19,12 +19,12 @@ type tester struct {
 }
 
 func TestKernelStore(t *testing.T) {
-	ctx := kctx.GetKernelCtx().Hassert("TestKernelStore()")
+	kCtx := kctx.GetKernelCtx()
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
-		ctx: ctx,
-		wg:  ctx.Wg(),
+		ctx: kCtx,
+		wg:  kCtx.Wg(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", "/store/store_kernel")
@@ -82,7 +82,7 @@ func (sf *tester) byPrefix() {
 	}
 	res := kernStore.ByPrefix("test")
 	res.Hassert("byPrefix(): val == nil")
-	lstKey := res.Val()
+	lstKey := res.Ok()
 	if len(lstKey) != 2 {
 		sf.t.Fatalf("byPrefix(): len(%v)!=2", len(lstKey))
 	}
@@ -91,9 +91,9 @@ func (sf *tester) byPrefix() {
 // Получение значения по ключу.
 func (sf *tester) get() {
 	sf.t.Log("get")
-	opt := kernStore.Get("test_key")
-	opt.Hassert("get(): val==nil")
-	strVal := string(opt.Val())
+	res := kernStore.Get("test_key")
+	res.Hassert("get(): val==nil")
+	strVal := string(res.Ok())
 	if strVal != "test_val" {
 		sf.t.Fatalf("get(): strVal(%v)!='test_val'", strVal)
 	}
@@ -115,10 +115,7 @@ var (
 // Закрытие хранилища.
 func (sf *tester) close() {
 	sf.t.Log("close")
-	res := sf.wg.Add(qName)
-	if res.IsErr() {
-		sf.t.Fatalf("close(): err=%v", res.Err())
-	}
+	sf.wg.Add(qName)
 	sf.ctx.Cancel()
 	time.Sleep(time.Millisecond * 20)
 	go sf.wg.Done(qName)
@@ -143,8 +140,8 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	_ = GetKernelStore().Hassert("newGood1()")
-	store := GetKernelStore().Hassert("newGood1()")
+	_ = GetKernelStore()
+	store := GetKernelStore()
 	if log := store.Log(); log == nil {
 		sf.t.Fatalf("newGood1(): log==nil")
 	}

+ 2 - 2
v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec.go

@@ -26,7 +26,7 @@ func NewDictRec() *DictRec {
 }
 
 // Get -- получение значения по ключу.
-func (sf *DictRec) Get(key *alias.AStoreKey) *mL0.Option[mKt.IRecKv] {
+func (sf *DictRec) Get(key *alias.AStoreKey) mL0.IOption[mKt.IRecKv] {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	rec, isOk := sf.dict[key]
@@ -37,7 +37,7 @@ func (sf *DictRec) Get(key *alias.AStoreKey) *mL0.Option[mKt.IRecKv] {
 }
 
 // Set -- установка значения по ключу.
-func (sf *DictRec) Set(rec mKt.IRecKv) *mL0.Result[bool] {
+func (sf *DictRec) Set(rec mKt.IRecKv) mL0.IResult[bool] {
 	if rec == nil {
 		return mL0.NewErr[bool](fmt.Errorf("DictRec.Set(): rec is nil"))
 	}

+ 5 - 4
v4/lev2/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

@@ -5,6 +5,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc"
 )
 
 var (
@@ -28,8 +29,8 @@ type KvBucketBase struct {
 	Number_    int                               `json:"num"`        // Номер бакета
 	Size_      int64                             `json:"size"`       // Размер бакета
 	SizeLimit_ int64                             `json:"size_limit"` // Лимит размера бакета
-	CreatedAt_ *alias.ATime                      `json:"created_at"` // Время создания бакета
-	UpdatedAt_ string                            `json:"updated_at"` // Время обновления бакета
+	CreatedAt_ ktypes.ITime                      `json:"created_at"` // Время создания бакета
+	UpdatedAt_ ktypes.ITimeMut                   `json:"updated_at"` // Время обновления бакета
 	Vers_      int                               `json:"vers"`       // Версия бакета
 	dictRec    map[alias.AStoreKey]ktypes.IRecKv // Словарь для хранения данных
 }
@@ -44,8 +45,8 @@ func NewKvBucketBase(name string, level int, number int) *KvBucketBase {
 		Level_:     level,
 		Number_:    number,
 		dictRec:    map[alias.AStoreKey]ktypes.IRecKv{},
-		CreatedAt_: alias.NewATime(),
-		UpdatedAt_: "",
+		CreatedAt_: voc.NewETime(voc.VTimeOptDefault()),
+		UpdatedAt_: voc.NewETime(voc.VTimeOptDefault(), voc.VTimeOptMut()),
 	}
 	return sf
 }

+ 12 - 10
v4/lev2/kstore_kv_std/rec_meta/rec_meta.go

@@ -5,6 +5,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc"
 )
 
 var (
@@ -18,11 +19,11 @@ var (
 // Даже если ключ содержит пробелы или экранированное форматирование
 // JSON их экранирует внутри.
 type RecMeta struct {
-	Key_       *alias.AStoreKey `json:"key"`        // Ключ
-	Vers_      int64            `json:"vers"`       // Версия записи
-	Operation_ string           `json:"operation"`  // Тип операции над записью
-	CreatedAt_ *alias.ATime     `json:"created_at"` // Дата создания записи
-	UpdateAt_  *alias.ATime     `json:"update_at"`  // Дата последнего обновления
+	Key_       *alias.AStoreKey `json:"key"`       // Ключ
+	Vers_      int64            `json:"vers"`      // Версия записи
+	Operation_ string           `json:"operation"` // Тип операции над записью
+	createdAt_ ktypes.ITime     `voc:"created_at"` // Дата создания записи
+	updateAt_  ktypes.ITimeMut  `voc:"update_at"`  // Дата последнего обновления
 
 	// Хеш мета-информации записи (вместе с значением, но без этого поля разумеется)
 	Sha_    string `json:"sha"`
@@ -36,7 +37,8 @@ func NewRecMeta(key *alias.AStoreKey) *RecMeta {
 		Key_:       key,
 		Vers_:      1,
 		Operation_: "create",
-		CreatedAt_: alias.NewATime(),
+		createdAt_: voc.NewETime(voc.VTimeOptDefault()),
+		updateAt_:  voc.NewETime(voc.VTimeOptDefault(), voc.VTimeOptMut()),
 	}
 	_ = ktypes.IRecMeta(sf)
 	return sf
@@ -58,11 +60,11 @@ func (sf *RecMeta) Operation() string {
 }
 
 // CreatedAt -- дата создания записи.
-func (sf *RecMeta) CreatedAt() *alias.ATime {
-	return sf.CreatedAt_
+func (sf *RecMeta) CreatedAt() ktypes.ITime {
+	return sf.createdAt_
 }
 
 // UpdateAt -- дата последнего обновления.
-func (sf *RecMeta) UpdateAt() *alias.ATime {
-	return sf.UpdateAt_
+func (sf *RecMeta) UpdateAt() ktypes.ITimeMut {
+	return sf.updateAt_
 }

+ 2 - 7
v4/lev2/kwg/kwg.go

@@ -5,7 +5,6 @@ package kwg
 
 import (
 	"context"
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -99,19 +98,15 @@ func (sf *kernelWg) Wait() {
 }
 
 // Add -- добавляет поток в ожидание.
-func (sf *kernelWg) Add(name *mKa.AStreamName) *mL0.Result[bool] {
+func (sf *kernelWg) Add(name *mKa.AStreamName) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Add(): stream='%v'", name)
-	if !sf.isWork.Get() {
-		err := fmt.Errorf("Add(): stream=%v, work end", name)
-		return mL0.NewErr[bool](err)
-	}
+	mL0.Hassert(sf.isWork.Get(), "Add(): stream=%v, work end", name)
 	mKh.Hassert(name.Get() != "", "Add(): name stream is empty")
 	_, isOk := sf.dictStream[name]
 	mKh.Hassert(!isOk, "Add(): stream '%v' already exists", name)
 	sf.dictStream[name] = true
-	return mL0.NewRes(true)
 }
 
 // Ожидает окончания работы ожидателя групп.

+ 3 - 9
v4/lev2/kwg/kwg_test.go

@@ -39,10 +39,7 @@ var (
 // Попытка добавления после закрытия ожидателя.
 func (sf *tester) addBad3() {
 	sf.t.Log("addBad3")
-	res := sf.wg.Add(qName)
-	if res.IsOk() {
-		sf.t.Fatalf("addBad3(): err==nil")
-	}
+	sf.wg.Add(qName)
 	_len := sf.wg.Len()
 	if _len != 0 {
 		sf.t.Fatalf("addBad3(): len(%v)!=0", _len)
@@ -80,15 +77,12 @@ func (sf *tester) addBad2() {
 			sf.t.Fatalf("addBad1(): len(lst)!=1, lst=%#v", lst)
 		}
 	}()
-	_ = sf.wg.Add(qName)
+	sf.wg.Add(qName)
 }
 
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
-	res := sf.wg.Add(qName)
-	if res.IsErr() {
-		sf.t.Fatalf("addGood1(): err=%v", res.Err())
-	}
+	sf.wg.Add(qName)
 }
 
 // Ожидание завершения ожидателя потоков.

+ 2 - 2
v4/lev2/log_topic/log_topic.go

@@ -16,7 +16,7 @@ type LogTopic struct {
 }
 
 // NewLogTopic -- возвращает новый элемент лога.
-func NewLogTopic(topic *mKa.ATopic, client mKt.IBusClient) *mL0.Result[*LogTopic] {
+func NewLogTopic(topic *mKa.ATopic, client mKt.IBusClient) mL0.IResult[*LogTopic] {
 	mL0.Hassert(topic != nil, "NewLogTopic(): topic==nil")
 	if client == nil {
 		err := fmt.Errorf("NewLogTopic(): IBusClient==nil")
@@ -30,7 +30,7 @@ func NewLogTopic(topic *mKa.ATopic, client mKt.IBusClient) *mL0.Result[*LogTopic
 }
 
 // Pub -- публикует сообщение в топик.
-func (sf *LogTopic) Pub(binMsg []byte) *mL0.Result[bool] {
+func (sf *LogTopic) Pub(binMsg []byte) mL0.IResult[bool] {
 	res := sf.client.Publish(sf.topic, binMsg)
 	if res.IsErr() {
 		err := fmt.Errorf("LogTopic.Pub(): in pub with client, err=\n\t%v", res.Err())

+ 4 - 4
v4/lev2/log_topic/log_topic_test.go

@@ -32,15 +32,15 @@ var (
 // Правильное создание топика.
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	busClient := client_bus_local.NewClientBusLocal().Hassert("newGood1()")
+	busClient := client_bus_local.NewClientBusLocal()
 	client := NewLogTopic(qTopicTest, busClient).Hassert("newGood1()")
 	res := client.Pub([]byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("newGood1(): err=%v", res.Err())
 	}
-	ctx := kctx.GetKernelCtx().Hassert("newGood1()")
-	ctx.Cancel()
-	ctx.Wg().Wait()
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Cancel()
+	kCtx.Wg().Wait()
 	res = client.Pub([]byte("test_msg"))
 	if !res.IsErr() {
 		sf.t.Fatalf("newGood1(): err==nil")

+ 1 - 1
v4/lev2/mock_hand_serve/mock_hand_serve.go

@@ -35,7 +35,7 @@ func NewMockHandlerServe(topic *mKa.ATopic, name string) *MockHandlerServe {
 }
 
 // Функция обратного вызова подписки.
-func (sf *MockHandlerServe) FnBack(binMsg []byte) *mL0.Result[[]byte] {
+func (sf *MockHandlerServe) FnBack(binMsg []byte) mL0.IResult[[]byte] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if sf.IsBad_.Get() {

+ 2 - 2
v4/lev2/mock_hand_serve/mock_hand_serve_test.go

@@ -32,8 +32,8 @@ func (sf *tester) backGood1() {
 	if res.IsErr() {
 		sf.t.Fatalf("backGood1(): err=%v", res.Err())
 	}
-	if string(res.Val()) != "test_msg" {
-		sf.t.Fatalf("backGood1(): binMsg(%v)!='test_msg'", string(res.Val()))
+	if string(res.Ok()) != "test_msg" {
+		sf.t.Fatalf("backGood1(): binMsg(%v)!='test_msg'", string(res.Ok()))
 	}
 }
 

+ 3 - 3
v4/lev2/mock_hand_sub_http/mock_hand_sub_http_test.go

@@ -31,7 +31,7 @@ func TestHandlerHttpSub(t *testing.T) {
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
-		ctx: kctx.GetKernelCtx().Hassert("TestHandlerHttpSub()"),
+		ctx: kctx.GetKernelCtx(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
@@ -43,7 +43,7 @@ func TestHandlerHttpSub(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.ctx.Set("monolitName", "test_monolit", "comment").Hassert("TestHandlerHttpSub()")
+	sf.ctx.Set("monolitName", "test_monolit", "comment")
 	sf.new()
 	sf.back()
 	sf.ctx.Cancel()
@@ -65,7 +65,7 @@ func (sf *tester) backGood1() {
 // Что-то случилось на той стороне.
 func (sf *tester) backBad2() {
 	sf.t.Log("backBad2")
-	kernServ := kserv_http.GetKernelServHttp().Hassert("backBad2()")
+	kernServ := kserv_http.GetKernelServHttp()
 	fiberApp := kernServ.Fiber()
 	sf.hand.WebHook_ = baseUrl + "test/local"
 	fiberApp.Post("/test/local", sf.testLocal)

+ 6 - 16
v4/lev2/wui/wui.go

@@ -2,8 +2,6 @@
 package wui
 
 import (
-	"fmt"
-
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_button"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
@@ -11,21 +9,13 @@ import (
 )
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text string, fnClick func(map[string]string) *mL0.Result[string]) *mL0.Result[mWt.IWuiButton] {
-	resBtn := wui_button.NewWuiButton(text, fnClick)
-	if resBtn.IsErr() {
-		err := fmt.Errorf("NewWuiButton(): text=%q, err=\n\t%w", text, resBtn.Err())
-		return mL0.NewErr[mWt.IWuiButton](err)
-	}
-	return mL0.NewRes(mWt.IWuiButton(resBtn.Val()))
+func NewWuiButton(text string, fnClick func(map[string]string) mL0.IResult[string]) mWt.IWuiButton {
+	wBtn := wui_button.NewWuiButton(text, fnClick)
+	return wBtn
 }
 
 // GetWuiCtx -- возвращает контекст WUI.
-func GetWuiCtx() *mL0.Result[mWt.IWuiCtx] {
-	resWuiCtx := wui_ctx.GetWuiCtx()
-	if resWuiCtx.IsErr() {
-		err := fmt.Errorf("GetWuiCtx(): err=\n\t%w", resWuiCtx.Err())
-		return mL0.NewErr[mWt.IWuiCtx](err)
-	}
-	return mL0.NewRes(resWuiCtx.Val())
+func GetWuiCtx() mWt.IWuiCtx {
+	wCtx := wui_ctx.GetWuiCtx()
+	return wCtx
 }

+ 8 - 20
v4/lev2/wui/wui_button/wui_button.go

@@ -2,7 +2,6 @@
 package wui_button
 
 import (
-	"fmt"
 	"strings"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -17,37 +16,26 @@ import (
 type WuiButton struct {
 	mWt.IWuiWidget
 	text   mWt.IWuiText
-	fnBack func(map[string]string) *mL0.Result[string]
+	fnBack func(map[string]string) mL0.IResult[string]
 	hx     mWt.IWuiHx
 }
 
 // FnBtnBack -- функция обратного вызова для кнопки.
-type FnBtnBack func(map[string]string) *mL0.Result[string]
+type FnBtnBack func(map[string]string) mL0.IResult[string]
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text string, fnBack FnBtnBack) *mL0.Result[*WuiButton] {
-	if fnBack == nil {
-		return mL0.NewErr[*WuiButton](fmt.Errorf("NewWuiButton(): text=%q, fnBack==nil", text))
-	}
+func NewWuiButton(text string, fnBack FnBtnBack) *WuiButton {
+	mL0.Hassert(fnBack!=nil, "NewWuiButton(): text=%q, fnBack==nil", text)
 	sf := &WuiButton{
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		text:       wui_text.NewWuiText(text),
 		fnBack:     fnBack,
 	}
 	sf.hx = wui_hx.NewWuiHx("/wui/click/" + sf.Id())
-	resWuiCtx := wui_ctx.GetWuiCtx()
-	if resWuiCtx.IsErr() {
-		err := fmt.Errorf("NewWuiButton(): text=%q, err=\n\t%w", text, resWuiCtx.Err())
-		return mL0.NewErr[*WuiButton](err)
-	}
-	wCtx := resWuiCtx.Val()
-	resSet := wCtx.Set(sf.Id(), sf, "WUI-кнопка")
-	if resSet.IsErr() {
-		err := fmt.Errorf("NewWuiButton(): text=%q, err=\n\t%w", text, resSet.Err())
-		return mL0.NewErr[*WuiButton](err)
-	}
+	wCtx := wui_ctx.GetWuiCtx()
+	wCtx.Set(sf.Id(), sf, "WUI-кнопка")
 	_ = mWt.IWuiButton(sf)
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Hx -- возвращает атрибуты HTMX.
@@ -61,7 +49,7 @@ func (sf *WuiButton) Text() mWt.IWuiText {
 }
 
 // Click -- событие нажатия.
-func (sf *WuiButton) Click(dict map[string]string) *mL0.Result[string] {
+func (sf *WuiButton) Click(dict map[string]string) mL0.IResult[string] {
 	return sf.fnBack(dict)
 }
 

+ 2 - 2
v4/lev2/wui/wui_button/wui_button_test.go

@@ -22,7 +22,7 @@ func TestWuiButton(t *testing.T) {
 // Создание кнопки.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	btn := NewWuiButton("test_val", sf.fnBack).Hassert("new()")
+	btn := NewWuiButton("test_val", sf.fnBack)
 	if btn == nil {
 		sf.t.Fatalf("new(): WuiButton==nil")
 	}
@@ -42,7 +42,7 @@ func (sf *tester) new() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnBack(dict map[string]string) *mL0.Result[string] {
+func (sf *tester) fnBack(dict map[string]string) mL0.IResult[string] {
 	sf.chCall <- "test"
 	return mL0.NewRes("test_click")
 }

+ 5 - 17
v4/lev2/wui/wui_ctx/wui_ctx.go

@@ -2,10 +2,8 @@
 package wui_ctx
 
 import (
-	"fmt"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
@@ -17,23 +15,13 @@ var (
 )
 
 // GetWuiCtx -- возвращает глобальный контекст графики.
-func GetWuiCtx() *mL0.Result[mWt.IWuiCtx] {
+func GetWuiCtx() mWt.IWuiCtx {
 	block.Lock()
 	defer block.Unlock()
 	if wCtx != nil {
-		return mL0.NewRes(wCtx)
+		return wCtx
 	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetWuiCtx(): in get kCtx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[mWt.IWuiCtx](err)
-	}
-	kCtx := resKernCtx.Val()
-	resWuiCtx := mL1.NewLocalCtx(kCtx.Ctx())
-	if resWuiCtx.IsErr() {
-		err := fmt.Errorf("GetWuiCtx(): in new localCtx, err=\n\t%w", resWuiCtx.Err())
-		return mL0.NewErr[mWt.IWuiCtx](err)
-	}
-	wCtx = resWuiCtx.Val()
-	return mL0.NewRes(wCtx)
+	kCtx := kctx.GetKernelCtx()
+	wCtx := mL1.NewLocalCtx(kCtx.Ctx())
+	return wCtx
 }

+ 3 - 13
v4/lev2/wui/wui_label/wui_label.go

@@ -2,7 +2,6 @@
 package wui_label
 
 import (
-	"fmt"
 	"strings"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -19,22 +18,13 @@ type WuiLabel struct {
 }
 
 // NewWuiLabel -- возвращает новую метку.
-func NewWuiLabel(text string) *mL0.Result[*WuiLabel] {
+func NewWuiLabel(text string) mL0.IResult[*WuiLabel] {
 	sf := &WuiLabel{
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		text:       wui_text.NewWuiText(text),
 	}
-	resWuiCtx := wui_ctx.GetWuiCtx()
-	if resWuiCtx.IsErr() {
-		err := fmt.Errorf("NewWuiLabel(): text=%q, err=\n\t%w", text, resWuiCtx.Err())
-		return mL0.NewErr[*WuiLabel](err)
-	}
-	wCtx := resWuiCtx.Val()
-	resSet := wCtx.Set(sf.Id(), sf, "WUI-метка")
-	if resSet.IsErr() {
-		err := fmt.Errorf("NewWuiLabel(): text=%q, in set label to wui xtx, err=\n\t%w", text, resSet.Err())
-		return mL0.NewErr[*WuiLabel](err)
-	}
+	wCtx := wui_ctx.GetWuiCtx()
+	wCtx.Set(sf.Id(), sf, "WUI-метка")
 	_ = mWt.IWuiLabel(sf)
 	return mL0.NewRes(sf)
 }

+ 1 - 1
v4/lev2/wui/wui_test.go

@@ -31,7 +31,7 @@ func (sf *tester) get() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnClick(dict map[string]string) *mL0.Result[string] {
+func (sf *tester) fnClick(dict map[string]string) mL0.IResult[string] {
 	sf.t.Log("fnClick")
 	return mL0.NewRes("test_click")
 }

+ 1 - 1
v4/lev2/wui/wui_types/iwui_button.go

@@ -10,7 +10,7 @@ type IWuiButton interface {
 	// Text -- возвращает текст кнопки
 	Text() IWuiText
 	// Click -- нажатие кнопки
-	Click(map[string]string) *mL0.Result[string]
+	Click(map[string]string) mL0.IResult[string]
 	// Hx -- атрибуты HTMX
 	Hx() IWuiHx
 }

+ 6 - 24
v4/lev3/mod_kctx/mod_kctx.go

@@ -2,10 +2,8 @@
 package mod_kctx
 
 import (
-	"fmt"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -30,33 +28,17 @@ var (
 )
 
 // GetModuleKernelCtx -- возвращает новый модуль контекста ядра.
-func GetModuleKernelCtx() *mL0.Result[*ModuleKernelCtx] {
+func GetModuleKernelCtx() *ModuleKernelCtx {
 	block.Lock()
 	defer block.Unlock()
 	if mod != nil {
-		return mL0.NewRes(mod)
-	}
-	resHttp := kserv_http.GetKernelServHttp()
-	if resHttp.IsErr() {
-		err := fmt.Errorf("GetModuleKernelCtx(): in get kernServHttp, err=\n\t%w", resHttp.Err())
-		return mL0.NewErr[*ModuleKernelCtx](err)
+		return mod
 	}
 	modName := alias.NewAModuleName("kCtx")
-	resModKern := kmodule.NewKernelModule(modName)
-	if resModKern.IsErr() {
-		err := fmt.Errorf("GetModuleKernelCtx(): in get kernMod, err=\n\t%w", resModKern.Err())
-		return mL0.NewErr[*ModuleKernelCtx](err)
-	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetModuleKernelCtx(): in get kernCtx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*ModuleKernelCtx](err)
-	}
-	kCtx := resKernCtx.Val()
 	sf := &ModuleKernelCtx{
-		kCtx:          kCtx,
-		IKernelModule: resModKern.Val(),
-		kServHttp:     resHttp.Val(),
+		kCtx:          kctx.GetKernelCtx(),
+		IKernelModule: kmodule.NewKernelModule(modName),
+		kServHttp:     kserv_http.GetKernelServHttp(),
 	}
 	sf.log = sf.Ctx().Log()
 	_ = page_monolit.GetPageMonolit()
@@ -64,7 +46,7 @@ func GetModuleKernelCtx() *mL0.Result[*ModuleKernelCtx] {
 
 	_ = http_api.NewHttpApi()
 	mod = sf
-	return mL0.NewRes(mod)
+	return mod
 }
 
 // Run -- запускает модуль в работу.

+ 6 - 6
v4/lev3/mod_kctx/mod_kctx_test.go

@@ -18,7 +18,7 @@ const (
 type tester struct {
 	t   *testing.T
 	me  *mock_env.MockEnv
-	ctx IKernelCtx
+	kCtx IKernelCtx
 	mod IKernelModule
 }
 
@@ -26,7 +26,7 @@ func TestModKernelCtx(t *testing.T) {
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
-		ctx: kctx.GetKernelCtx().Hassert("TestModKernelCtx()"),
+		kCtx: kctx.GetKernelCtx(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
@@ -38,7 +38,7 @@ func TestModKernelCtx(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.ctx.Set("monolitName", "test_monolit", "test").Hassert("TestModKernelCtx()")
+	sf.kCtx.Set("monolitName", "test_monolit", "test")
 	sf.new()
 	sf.done()
 }
@@ -46,8 +46,8 @@ func TestModKernelCtx(t *testing.T) {
 // Завершение работы.
 func (sf *tester) done() {
 	sf.t.Log("done")
-	sf.ctx.Cancel()
-	sf.ctx.Wg().Wait()
+	sf.kCtx.Cancel()
+	sf.kCtx.Wg().Wait()
 	if isWork := sf.mod.IsWork(); isWork {
 		sf.t.Fatalf("newGood1(): isWork==true")
 	}
@@ -65,7 +65,7 @@ func (sf *tester) newGood1() {
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18328/")
-	sf.mod = GetModuleKernelCtx().Hassert("newGood1()")
+	sf.mod = GetModuleKernelCtx()
 	_ = GetModuleKernelCtx()
 	if sf.mod == nil {
 		sf.t.Fatalf("newGood1(): mod==nil")

+ 8 - 24
v4/lev3/mod_keeper/mod_keeper.go

@@ -2,10 +2,8 @@
 package mod_keeper
 
 import (
-	"fmt"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -30,33 +28,19 @@ var (
 )
 
 // GetModuleKeeper -- возвращает новый модуль сторожа ядра.
-func GetModuleKeeper() *mL0.Result[*ModuleKeeper] {
+func GetModuleKeeper() *ModuleKeeper {
 	block.Lock()
 	defer block.Unlock()
 	if mod != nil {
-		return mL0.NewRes(mod)
-	}
-	resHttp := kserv_http.GetKernelServHttp()
-	if resHttp.IsErr() {
-		err := fmt.Errorf("GetModuleKeeper(): in get KernelServerHttp, err=\n\t%w", resHttp.Err())
-		return mL0.NewErr[*ModuleKeeper](err)
+		return mod
 	}
+	kServHttp := kserv_http.GetKernelServHttp()
 	modName := alias.NewAModuleName("kKeeper")
-	resModKeep := kmodule.NewKernelModule(modName)
-	if resModKeep.IsErr() {
-		err := fmt.Errorf("GetModuleKeeper(): in get resModKeeper, err=\n\t%w", resModKeep.Err())
-		return mL0.NewErr[*ModuleKeeper](err)
-	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetModuleKeeper(): in get resKernCtx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*ModuleKeeper](err)
-	}
-	kCtx := resKernCtx.Val()
+	kModKeep := kmodule.NewKernelModule(modName)
 	sf := &ModuleKeeper{
-		kCtx:          kCtx,
-		IKernelModule: resModKeep.Val(),
-		kServHttp:     resHttp.Val(),
+		kCtx:          kctx.GetKernelCtx(),
+		IKernelModule: kModKeep,
+		kServHttp:     kServHttp,
 	}
 	sf.log = sf.kCtx.Keeper().Log()
 	_ = page_monolit.GetPageMonolit()
@@ -64,7 +48,7 @@ func GetModuleKeeper() *mL0.Result[*ModuleKeeper] {
 
 	_ = http_api.NewHttpApi()
 	mod = sf
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Run -- запускает модуль в работу.

+ 6 - 6
v4/lev3/mod_keeper/mod_keeper_test.go

@@ -18,7 +18,7 @@ const (
 type tester struct {
 	t   *testing.T
 	me  *mock_env.MockEnv
-	ctx IKernelCtx
+	kCtx IKernelCtx
 	mod IKernelModule
 }
 
@@ -26,7 +26,7 @@ func TestModKeeper(t *testing.T) {
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
-		ctx: kctx.GetKernelCtx().Hassert("TestModKeeper()"),
+		kCtx: kctx.GetKernelCtx(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
@@ -38,7 +38,7 @@ func TestModKeeper(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.ctx.Set("monolitName", "test_monolit", "test").Hassert("TestModKeeper()")
+	sf.kCtx.Set("monolitName", "test_monolit", "test")
 	sf.new()
 	sf.done()
 }
@@ -46,8 +46,8 @@ func TestModKeeper(t *testing.T) {
 // Завершение работы.
 func (sf *tester) done() {
 	sf.t.Log("done")
-	sf.ctx.Cancel()
-	sf.ctx.Wg().Wait()
+	sf.kCtx.Cancel()
+	sf.kCtx.Wg().Wait()
 	if isWork := sf.mod.IsWork(); isWork {
 		sf.t.Fatalf("newGood1(): isWork==true")
 	}
@@ -65,7 +65,7 @@ func (sf *tester) newGood1() {
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18320/")
-	sf.mod = GetModuleKeeper().Hassert("newGood1()")
+	sf.mod = GetModuleKeeper()
 	_ = GetModuleKeeper()
 	if sf.mod == nil {
 		sf.t.Fatalf("newGood1(): mod==nil")

+ 8 - 19
v4/lev3/mod_serv_http/btn_modules/btn_modules.go

@@ -19,24 +19,13 @@ type BtnModules struct {
 }
 
 // NewBtnModules -- возвращает новую кнопку для показа модулей.
-func NewBtnModules() *mL0.Result[*BtnModules] {
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("NewBtnModules(): err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*BtnModules](err)
-	}
-	kCtx := resKernCtx.Val()
+func NewBtnModules() *BtnModules {
 	sf := &BtnModules{
-		kCtx: kCtx,
-	}
-	resBtn := wui.NewWuiButton("Modules", sf.clickMonolit)
-	if resBtn.IsErr() {
-		err := fmt.Errorf("NewBtnModules(): err=\n\t%w", resBtn.Err())
-		return mL0.NewErr[*BtnModules](err)
+		kCtx: kctx.GetKernelCtx(),
 	}
-	sf.btn = resBtn.Val()
+	sf.btn = wui.NewWuiButton("Modules", sf.clickMonolit)
 	sf.btn.Hx().Target().Set("#modules")
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Html -- возвращает HTML-представление кнопки.
@@ -51,13 +40,13 @@ var strBlockModules string
 var strBlockRow string
 
 // Событие клика по кнопке.
-func (sf *BtnModules) clickMonolit(dict map[string]string) *mL0.Result[string] {
+func (sf *BtnModules) clickMonolit(dict map[string]string) mL0.IResult[string] {
 	optMonolit := sf.kCtx.Get("monolit")
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("clickMonolit(): monolit module not found")
 		return mL0.NewErr[string](err)
 	}
-	mon := optMonolit.Val().Val().(mKt.IKernelMonolit)
+	mon := optMonolit.Some().Val().(mKt.IKernelMonolit)
 	chLst := mon.Ctx().SortedList()
 	strOut := ``
 	for _, val := range chLst {
@@ -74,8 +63,8 @@ func (sf *BtnModules) clickMonolit(dict map[string]string) *mL0.Result[string] {
 		type_ := fmt.Sprintf("%#T", val.Val())
 		type_ = strings.ReplaceAll(type_, ".", ".<br>")
 		strRow = strings.ReplaceAll(strRow, "{.type}", type_)
-		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().Get())
-		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().Get())
+		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().String())
+		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().String())
 		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
 		strOut += strRow
 	}

+ 6 - 6
v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go

@@ -10,16 +10,16 @@ import (
 )
 
 func TestBtnModules(t *testing.T) {
-	btn := NewBtnModules().Hassert("TestBtnModules()")
+	btn := NewBtnModules()
 	if html := btn.Html(); html == "" {
 		t.Fatalf("html is empty")
 	}
-	kCtx := kctx.GetKernelCtx().Hassert("TestBtnModules()")
-	kCtx.Set("isLocal", true, "test").Hassert("TestBtnModules()")
-	kMon := kmonolit.GetMonolit("test").Hassert("TestBtnModules()")
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Set("isLocal", true, "test")
+	kMon := kmonolit.GetMonolit("test")
 	modName := alias.NewAModuleName("test")
-	mod := kmodule.NewKernelModule(modName).Hassert("TestBtnModules()")
-	kMon.Add(mod).Hassert("TestBtnModules()")
+	mod := kmodule.NewKernelModule(modName)
+	kMon.Add(mod)
 	if str := btn.clickMonolit(map[string]string{}).
 		Hassert("TestBtnModules()"); str == "" {
 		t.Fatalf("strOut is empty")

+ 4 - 10
v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go

@@ -3,7 +3,6 @@ package btn_monolit
 
 import (
 	_ "embed"
-	"fmt"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui"
@@ -15,16 +14,11 @@ type BtnMonolit struct {
 }
 
 // NewBtnMonolit -- возвращает новую кнопку монолита.
-func NewBtnMonolit() *mL0.Result[*BtnMonolit] {
+func NewBtnMonolit() *BtnMonolit {
 	sf := &BtnMonolit{}
-	resBtn := wui.NewWuiButton("Monolit", sf.clickMonolit)
-	if resBtn.IsErr() {
-		err := fmt.Errorf("NewBtnMonolit(): err=\n\t%w", resBtn.Err())
-		return mL0.NewErr[*BtnMonolit](err)
-	}
-	sf.btn = resBtn.Val()
+	sf.btn = wui.NewWuiButton("Monolit", sf.clickMonolit)
 	sf.btn.Hx().Target().Set("#monolit")
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Html -- возвращает HTML-представление кнопки.
@@ -36,6 +30,6 @@ func (sf *BtnMonolit) Html() string {
 var strBlockMonolit string
 
 // Событие клика по кнопке.
-func (sf *BtnMonolit) clickMonolit(dict map[string]string) *mL0.Result[string] {
+func (sf *BtnMonolit) clickMonolit(dict map[string]string) mL0.IResult[string] {
 	return mL0.NewRes(strBlockMonolit)
 }

+ 6 - 6
v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go

@@ -10,16 +10,16 @@ import (
 )
 
 func TestBtnModules(t *testing.T) {
-	btn := NewBtnMonolit().Hassert("TestBtnModules()")
+	btn := NewBtnMonolit()
 	if html := btn.Html(); html == "" {
 		t.Fatalf("html is empty")
 	}
-	kCtx := kctx.GetKernelCtx().Hassert("TestBtnModules()")
-	kCtx.Set("isLocal", true, "test").Hassert("TestBtnModules()")
-	kMon := kmonolit.GetMonolit("test").Hassert("TestBtnModules()")
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Set("isLocal", true, "test")
+	kMon := kmonolit.GetMonolit("test")
 	modName := alias.NewAModuleName("test")
-	mod := kmodule.NewKernelModule(modName).Hassert("TestBtnModules()")
-	kMon.Add(mod).Hassert("TestBtnModules()")
+	mod := kmodule.NewKernelModule(modName)
+	kMon.Add(mod)
 	if str := btn.clickMonolit(map[string]string{}).
 		Hassert("TestBtnModules()"); str == "" {
 		t.Fatalf("strOut is empty")

+ 6 - 11
v4/lev3/mod_serv_http/http_api/http_api.go

@@ -7,7 +7,7 @@ import (
 	"github.com/gofiber/fiber/v3"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
@@ -15,26 +15,21 @@ import (
 type HttpApi struct{}
 
 // NewHttpApi -- возвращает новое HttpApi.
-func NewHttpApi() *mL0.Result[*HttpApi] {
+func NewHttpApi() mL0.IResult[*HttpApi] {
 	sf := &HttpApi{}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("NewHttpApi(): in kern ctx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*HttpApi](err)
-	}
-	kCtx := resKernCtx.Val()
+	kCtx := kctx.GetKernelCtx()
 	optFiber := kCtx.Get("fiberApp")
 	if optFiber.IsNone() {
 		err := fmt.Errorf("NewHttpApi(): not found fiberApp in kernel ctx")
 		return mL0.NewErr[*HttpApi](err)
 	}
-	fiberApp := optFiber.Val().Val().(*fiber.App)
+	fiberApp := optFiber.Some().Val().(*fiber.App)
 	fiberApp.Post("/api_time", sf.postTime)
 	return mL0.NewRes(sf)
 }
 
 // Возвращает текущее время сервера.
 func (sf *HttpApi) postTime(ctx fiber.Ctx) error {
-	aTime := alias.NewATime()
-	return ctx.SendString(aTime.Get())
+	aTime := voc.NewETime(voc.VTimeOptDefault())
+	return ctx.SendString(aTime.String())
 }

+ 6 - 6
v4/lev3/mod_serv_http/http_api/http_api_test.go

@@ -14,7 +14,7 @@ import (
 
 type tester struct {
 	t    *testing.T
-	ctx  IKernelCtx
+	kCtx  IKernelCtx
 	serv IKernelServerHttp
 	api  *HttpApi
 }
@@ -22,7 +22,7 @@ type tester struct {
 func TestPageMonolit(t *testing.T) {
 	sf := &tester{
 		t:   t,
-		ctx: kctx.GetKernelCtx().Hassert("TestPageMonolit()"),
+		kCtx: kctx.GetKernelCtx(),
 	}
 	sf.new()
 	sf.getTime()
@@ -52,8 +52,8 @@ func (sf *tester) getTime() {
 // Освобождает ресурсы.
 func (sf *tester) done() {
 	sf.t.Log("done")
-	sf.ctx.Cancel()
-	sf.ctx.Wg().Wait()
+	sf.kCtx.Cancel()
+	sf.kCtx.Wg().Wait()
 }
 
 // Создаёт новую страницу монолита.
@@ -62,9 +62,9 @@ func (sf *tester) new() {
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18312/")
-	sf.ctx.Set("isLocal", true, "testing").Hassert("new()")
+	sf.kCtx.Set("isLocal", true, "testing")
 	_ = kmonolit.GetMonolit("test_monolit")
-	sf.serv = kserv_http.GetKernelServHttp().Hassert("new()")
+	sf.serv = kserv_http.GetKernelServHttp()
 
 	sf.api = NewHttpApi().Hassert("new()")
 	if sf.api == nil {

+ 5 - 17
v4/lev3/mod_serv_http/mod_serv_http.go

@@ -2,10 +2,8 @@
 package mod_serv_http
 
 import (
-	"fmt"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
@@ -28,26 +26,16 @@ var (
 )
 
 // GetModuleServHttp -- возвращает новый модуль HTTP-сервера.
-func GetModuleServHttp() *mL0.Result[*ModuleServHttp] {
+func GetModuleServHttp() *ModuleServHttp {
 	block.Lock()
 	defer block.Unlock()
 	if mod != nil {
-		return mL0.NewRes(mod)
+		return mod
 	}
 	modName := alias.NewAModuleName("kServHttp")
-	resMod := kmodule.NewKernelModule(modName)
-	if resMod.IsErr() {
-		err := fmt.Errorf("GetModuleServHttp(): in NewKernelModule, err=\n\t%w", resMod.Err())
-		return mL0.NewErr[*ModuleServHttp](err)
-	}
-	resHttp := kserv_http.GetKernelServHttp()
-	if resHttp.IsErr() {
-		err := fmt.Errorf("GetModuleServHttp(): in GetKernelServHttp, err=\n\t%w", resHttp.Err())
-		return mL0.NewErr[*ModuleServHttp](err)
-	}
 	sf := &ModuleServHttp{
-		IKernelModule: resMod.Val(),
-		kServHttp:     resHttp.Val(),
+		IKernelModule: kmodule.NewKernelModule(modName),
+		kServHttp:     kserv_http.GetKernelServHttp(),
 	}
 	sf.log = sf.Ctx().Log()
 	_ = page_monolit.GetPageMonolit()
@@ -55,7 +43,7 @@ func GetModuleServHttp() *mL0.Result[*ModuleServHttp] {
 
 	_ = http_api.NewHttpApi()
 	mod = sf
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Run -- запускает модуль в работу.

+ 3 - 3
v4/lev3/mod_serv_http/mod_serv_http_test.go

@@ -27,7 +27,7 @@ func TestModServHttp(t *testing.T) {
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
-		ctx: kctx.GetKernelCtx().Hassert("TestModServHttp()"),
+		ctx: kctx.GetKernelCtx(),
 	}
 	err := os.Unsetenv("LOCAL_STORE_PATH")
 	Hassert(err == nil, "err=%v", err)
@@ -43,7 +43,7 @@ func TestModServHttp(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.ctx.Set("monolitName", "test_monolit", "test").Hassert("TestModServHttp()")
+	sf.ctx.Set("monolitName", "test_monolit", "test")
 	sf.new()
 	sf.done()
 }
@@ -72,7 +72,7 @@ func (sf *tester) newGood1() {
 	Hassert(err == nil, "newGood1(): err=%v", err)
 	err = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18301/")
 	Hassert(err == nil, "newGood1(): err=%v", err)
-	sf.mod = GetModuleServHttp().Hassert("newGood1()")
+	sf.mod = GetModuleServHttp()
 	_ = GetModuleServHttp()
 	if sf.mod == nil {
 		sf.t.Fatalf("newGood1(): mod==nil")

+ 7 - 16
v4/lev3/mod_serv_http/page_module/page_module.go

@@ -21,27 +21,18 @@ type PageModule struct {
 var page *PageModule
 
 // GetPageModule -- возвращает страницу модуля.
-func GetPageModule() *mL0.Result[*PageModule] {
+func GetPageModule() mL0.IResult[*PageModule] {
 	if page != nil {
 		return mL0.NewRes(page)
 	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetPageModule(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*PageModule](err)
-	}
-	kCtx := resKernCtx.Val()
+	kCtx := kctx.GetKernelCtx()
 	optFiber := kCtx.Get("fiberApp")
 	if optFiber.IsNone() {
 		err := fmt.Errorf("GetPageModule(): not found fiberApp in kernel ctx")
 		return mL0.NewErr[*PageModule](err)
 	}
-	fiberApp := optFiber.Val().Val().(*fiber.App)
-	resSet := kCtx.Set("fiberApp", fiberApp, "fiberApp in GetPageModule()")
-	if resSet.IsErr() {
-		err := fmt.Errorf("GetPageModule(): in set fiberApp from kernel ctx, err=\n\t%w", resSet.Err())
-		return mL0.NewErr[*PageModule](err)
-	}
+	fiberApp := optFiber.Some().Val().(*fiber.App)
+	kCtx.Set("fiberApp", fiberApp, "fiberApp in GetPageModule()")
 	sf := &PageModule{
 		ctx: kCtx,
 	}
@@ -126,8 +117,8 @@ func (sf *PageModule) postModuleCtx(ctx fiber.Ctx) error {
 		_type := fmt.Sprintf("%#T", _val)
 		_type = strings.ReplaceAll(_type, ".", ".<br>")
 		strRow = strings.ReplaceAll(strRow, "{.type}", _type)
-		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().Get())
-		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().Get())
+		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().String())
+		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().String())
 		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
 		strOut += strRow
 	}
@@ -240,7 +231,7 @@ func (sf *PageModule) getModule(id string) (mKt.IKernelModule, mKt.ICtxValue) {
 	if optMonolit.IsNone() {
 		return nil, nil
 	}
-	mon := optMonolit.Val().Val().(mKt.IKernelMonolit)
+	mon := optMonolit.Some().Val().(mKt.IKernelMonolit)
 	chLst := mon.Ctx().SortedList()
 	var (
 		val    mKt.ICtxValue

+ 19 - 20
v4/lev3/mod_serv_http/page_module/page_module_test.go

@@ -26,7 +26,7 @@ type tester struct {
 func TestPageMonolit(t *testing.T) {
 	sf := &tester{
 		t:   t,
-		ctx: kctx.GetKernelCtx().Hassert("TestPageMonolit()"),
+		ctx: kctx.GetKernelCtx(),
 	}
 	sf.new()
 	sf.postModule()
@@ -107,16 +107,15 @@ func (sf *tester) postSvgDayGood1() {
 
 func (sf *tester) comSvgPost() *fiber.App {
 	sf.t.Log("comSvgPost")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("comSvgPost()")
+	mon := kmonolit.GetMonolit("test_monolit")
 	ctxMon := mon.Ctx()
 	modName := alias.NewAModuleName("kCtx")
-	module := kmodule.NewKernelModule(modName).Hassert("comSvgPost()")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").
-		Hassert("postSvgDayGood1()")
+	kMod := kmodule.NewKernelModule(modName)
+	kMod.Log().Debug("test msg")
+	ctxMod := kMod.Ctx()
+	ctxMod.Set("demo_key", "demo value", "for demo comment")
 	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("comSvgPost()")
+	ctxMon.Set("module_1", kMod, "test_module")
 	fiberApp := sf.serv.Fiber()
 	return fiberApp
 }
@@ -125,15 +124,15 @@ func (sf *tester) comSvgPost() *fiber.App {
 func (sf *tester) postSvgMinBad1() {
 	sf.t.Log("postSvgMinBad1")
 	sf.comSvgPost()
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgMinBad1()")
+	mon := kmonolit.GetMonolit("test_monolit")
 	ctxMon := mon.Ctx()
 	modName := alias.NewAModuleName("kCtx")
-	module := kmodule.NewKernelModule(modName).Hassert("postSvgMinBad1()")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgMinBad1()")
+	kMod := kmodule.NewKernelModule(modName)
+	kMod.Log().Debug("test msg")
+	ctxMod := kMod.Ctx()
+	ctxMod.Set("demo_key", "demo value", "for demo comment")
 	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postSvgMinBad1()")
+	ctxMon.Set("module_1", kMod, "test_module")
 	fiberApp := sf.serv.Fiber()
 	req, err := http.NewRequest(http.MethodPost, "/module_svg_min/svg_min_20.svg", nil)
 	if err != nil {
@@ -254,16 +253,16 @@ func (sf *tester) postModuleState() {
 // Возвращает состояние модуля 1 (теперь добавлен).
 func (sf *tester) postModule1() {
 	sf.t.Log("postModule1")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postModule1()")
+	mon := kmonolit.GetMonolit("test_monolit")
 	ctxMon := mon.Ctx()
 	modName := alias.NewAModuleName("kCtx")
-	module := kmodule.NewKernelModule(modName).Hassert("postModule1()")
+	module := kmodule.NewKernelModule(modName)
 	module.Log().Debug("test msg")
 	module.Log().Debug("test msg")
 	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postModule1()")
+	ctxMod.Set("demo_key", "demo value", "for demo comment")
 	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postModule1()")
+	ctxMon.Set("module_1", module, "test_module")
 	fiberApp := sf.serv.Fiber()
 	req, err := http.NewRequest(http.MethodPost, "/module/1", nil)
 	if err != nil {
@@ -358,9 +357,9 @@ func (sf *tester) new() {
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18322/")
-	sf.ctx.Set("isLocal", true, "testing").Hassert("new()")
+	sf.ctx.Set("isLocal", true, "testing")
 	_ = kmonolit.GetMonolit("test_monolit")
-	sf.serv = kserv_http.GetKernelServHttp().Hassert("new()")
+	sf.serv = kserv_http.GetKernelServHttp()
 
 	sf.page = GetPageModule().Hassert("new()")
 	if sf.page == nil {

+ 26 - 40
v4/lev3/mod_serv_http/page_monolit/page_monolit.go

@@ -5,10 +5,10 @@ import (
 	_ "embed"
 	"fmt"
 	"strings"
+	"sync"
 
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/btn_modules"
@@ -17,52 +17,38 @@ import (
 
 // PageMonolit -- страница показа монолита.
 type PageMonolit struct {
-	ctx        mKt.IKernelCtx
+	kCtx        mKt.IKernelCtx
 	btnMonolit *btn_monolit.BtnMonolit
 	btnModules *btn_modules.BtnModules
 }
 
-var page *PageMonolit
+var (
+	page *PageMonolit
+	block sync.Mutex
+)
 
 // GetPageMonolit -- возвращает страницу монолита.
-func GetPageMonolit() *mL0.Result[*PageMonolit] {
+func GetPageMonolit() *PageMonolit {
+	block.Lock()
+	defer block.Unlock()
 	if page != nil {
-		return mL0.NewRes(page)
-	}
-	resMon := btn_monolit.NewBtnMonolit()
-	if resMon.IsErr() {
-		err := fmt.Errorf("GetPageMonolit(): mod='monolit', err=\n\t%w", resMon.Err())
-		return mL0.NewErr[*PageMonolit](err)
-	}
-	resMod := btn_modules.NewBtnModules()
-	if resMod.IsErr() {
-		err := fmt.Errorf("GetPageMonolit(): mod='monolit', err=\n\t%w", resMod.Err())
-		return mL0.NewErr[*PageMonolit](err)
+		return page
 	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetPageMonolit(): mod='monolit', err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*PageMonolit](err)
-	}
-	kCtx := resKernCtx.Val()
 	sf := &PageMonolit{
-		ctx:        kCtx,
-		btnMonolit: resMon.Val(),
-		btnModules: resMod.Val(),
+		kCtx:        kctx.GetKernelCtx(),
+		btnMonolit: btn_monolit.NewBtnMonolit(),
+		btnModules: btn_modules.NewBtnModules(),
 	}
 
-	optFiber := kCtx.Get("fiberApp")
-	if optFiber.IsNone() {
-		err := fmt.Errorf("GetPageMonolit(): mod='monolit', not found fiberApp in kernel ctx")
-		return mL0.NewErr[*PageMonolit](err)
-	}
-	fiberApp := optFiber.Val().Val().(*fiber.App)
+	optFiber := sf.kCtx.Get("fiberApp")
+	optFiber.Hassert("GetPageMonolit(): mod='monolit', not found fiberApp in kernel ctx")
+	fiberApp := optFiber.Some().Val().(*fiber.App)
 	fiberApp.Get("/monolit", sf.getMonolit)
 	fiberApp.Post("/monolit_state", sf.postMonolitState)
 	fiberApp.Post("/monolit_ctx", sf.postMonolitCtx)
 	fiberApp.Post("/monolit_log", sf.postMonolitLog)
 	page = sf
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Функция обратного вызова при клике на кнопку "Монолит".
@@ -75,12 +61,12 @@ var strLogBlock string
 
 // Возвращает страницу лога монолита.
 func (sf *PageMonolit) postMonolitLog(ctx fiber.Ctx) error {
-	optMonolit := sf.ctx.Get("monolit")
+	optMonolit := sf.kCtx.Get("monolit")
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitLog(): mod='monolit', not found monolit in kernel ctx")
 		return err
 	}
-	mon := optMonolit.Val().Val().(mKt.IKernelMonolit)
+	mon := optMonolit.Some().Val().(mKt.IKernelMonolit)
 	_log := mon.Log()
 	strOut := ""
 	for i := range 100 {
@@ -102,12 +88,12 @@ var strCtxRowBlock string
 
 // Возвращает блок контекста монолита.
 func (sf *PageMonolit) postMonolitCtx(ctx fiber.Ctx) error {
-	resMon := sf.ctx.Get("monolit")
-	if resMon.IsNone() {
+	optMon := sf.kCtx.Get("monolit")
+	if optMon.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitCtx(): mod='monolit', not found monolit in kernel ctx")
 		return err
 	}
-	mon := resMon.Val().Val().(mKt.IKernelMonolit)
+	mon := optMon.Some().Val().(mKt.IKernelMonolit)
 	chLst := mon.Ctx().SortedList()
 	strOut := ``
 	for _, val := range chLst {
@@ -117,8 +103,8 @@ func (sf *PageMonolit) postMonolitCtx(ctx fiber.Ctx) error {
 		type_ := fmt.Sprintf("%#T", val.Val())
 		type_ = strings.ReplaceAll(type_, ".", ",<br>")
 		strRow = strings.ReplaceAll(strRow, "{.type}", type_)
-		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().Get())
-		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().Get())
+		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().String())
+		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().String())
 		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
 		strOut += strRow
 	}
@@ -132,12 +118,12 @@ var strStateMonolit string
 // Показывает состояние монолита.
 func (sf *PageMonolit) postMonolitState(ctx fiber.Ctx) error {
 	dictState := map[string]any{}
-	optMonolit := sf.ctx.Get("monolit")
+	optMonolit := sf.kCtx.Get("monolit")
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitState(): mod='monolit', not found monolit from kernel ctx")
 		return err
 	}
-	ctxMon := optMonolit.Val()
+	ctxMon := optMonolit.Some()
 	mon := ctxMon.Val().(mKt.IKernelMonolit)
 	dictState["{.name}"] = mon.Name()
 	dictState["{.createAt}"] = ctxMon.CreateAt()

+ 4 - 4
v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go

@@ -23,7 +23,7 @@ type tester struct {
 func TestPageMonolit(t *testing.T) {
 	sf := &tester{
 		t:   t,
-		ctx: kctx.GetKernelCtx().Hassert("TestPageMonolit()"),
+		ctx: kctx.GetKernelCtx(),
 	}
 	sf.new()
 	sf.getMonolit()
@@ -132,7 +132,7 @@ func (sf *tester) new() {
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18310/")
-	sf.ctx.Set("isLocal", true, "testing").Hassert("new()")
+	sf.ctx.Set("isLocal", true, "testing")
 	for {
 		SleepMs()
 		if sf.ctx.Get("isLocal") != nil {
@@ -140,9 +140,9 @@ func (sf *tester) new() {
 		}
 	}
 	_ = kmonolit.GetMonolit("test_monolit")
-	sf.serv = kserv_http.GetKernelServHttp().Hassert("new()")
+	sf.serv = kserv_http.GetKernelServHttp()
 
-	sf.page = GetPageMonolit().Hassert("new()")
+	sf.page = GetPageMonolit()
 	if sf.page == nil {
 		sf.t.Fatalf("new(): page==nil")
 	}

+ 14 - 39
v4/lev3/mod_wui/mod_wui.go

@@ -10,7 +10,6 @@ import (
 	"github.com/gofiber/fiber/v2/middleware/adaptor"
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
@@ -39,40 +38,18 @@ var (
 )
 
 // GetModuleWui -- возвращает новый модуль WUI.
-func GetModuleWui() *mL0.Result[*ModuleWui] {
+func GetModuleWui() *ModuleWui {
 	block.Lock()
 	defer block.Unlock()
 	if mod != nil {
-		return mL0.NewRes(mod)
+		return mod
 	}
 	modName := alias.NewAModuleName("wui")
-	resMod := kmodule.NewKernelModule(modName)
-	if resMod.IsErr() {
-		err := fmt.Errorf("GetModuleWui(): mod='wui', in create kernel module, err=\n\t%w", resMod.Err())
-		return mL0.NewErr[*ModuleWui](err)
-	}
-	resHttp := kserv_http.GetKernelServHttp()
-	if resHttp.IsErr() {
-		err := fmt.Errorf("GetModuleWui(): mod='wui', in get KernelServerHttp, err=\n\t%w", resHttp.Err())
-		return mL0.NewErr[*ModuleWui](err)
-	}
-	resKernCtx := kctx.GetKernelCtx()
-	if resKernCtx.IsErr() {
-		err := fmt.Errorf("GetModuleWui(): mod='wui', in get KernelCtx, err=\n\t%w", resKernCtx.Err())
-		return mL0.NewErr[*ModuleWui](err)
-	}
-	kCtx := resKernCtx.Val()
-	resWuiCtx := wui.GetWuiCtx()
-	if resWuiCtx.IsErr() {
-		err := fmt.Errorf("GetModuleWui(): mod='wui', in get WuiCtx, err=\n\t%w", resWuiCtx.Err())
-		return mL0.NewErr[*ModuleWui](err)
-	}
-	wuiCtx := resWuiCtx.Val()
 	sf := &ModuleWui{
-		kCtx:          kCtx,
-		wCtx:          wuiCtx,
-		IKernelModule: resMod.Val(),
-		kServHttp:     resHttp.Val(),
+		kCtx:          kctx.GetKernelCtx(),
+		wCtx:          wui.GetWuiCtx(),
+		IKernelModule: kmodule.NewKernelModule(modName),
+		kServHttp:     kserv_http.GetKernelServHttp(),
 	}
 	sf.log = sf.wCtx.Log()
 	_ = page_monolit.GetPageMonolit()
@@ -80,14 +57,11 @@ func GetModuleWui() *mL0.Result[*ModuleWui] {
 
 	_ = http_api.NewHttpApi()
 	optFiber := sf.kCtx.Get("fiberApp")
-	if optFiber.IsNone() {
-		err := fmt.Errorf("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx")
-		return mL0.NewErr[*ModuleWui](err)
-	}
-	fibApp := optFiber.Val().Val().(*fiber.App)
+	optFiber.Hassert("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx")
+	fibApp := optFiber.Some().Val().(*fiber.App)
 	fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet)
 	mod = sf
-	return mL0.NewRes(sf)
+	return sf
 }
 
 // Run -- запускает модуль в работу.
@@ -110,16 +84,17 @@ func (sf *ModuleWui) IsWork() bool {
 func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
 	url := req.RequestURI
 	id := strings.TrimPrefix(url, "/wui/click/")
-	widget0 := sf.wCtx.Get(id)
-	if widget0 == nil {
+	optWidget := sf.wCtx.Get(id)
+	if optWidget == nil {
 		strOut := fmt.Sprintf("ModuleWui.wuiClick(): id(%v), widget not exists", id)
 		sf.log.Err(strOut)
 		_, _ = fmt.Fprint(resp, strOut)
 		return
 	}
-	widget1, isOk := widget0.Val().(mWt.IWuiButton)
+	widget1, isOk := optWidget.Some().(mWt.IWuiButton)
 	if !isOk {
-		strOut := fmt.Sprintf("ModuleWui.wuiClick(): widget(%T) not button", widget0.Val())
+		strOut := fmt.Sprintf("ModuleWui.wuiClick(): widget(%T) not button",
+			optWidget.Some())
 		sf.log.Err(strOut)
 		_, _ = fmt.Fprint(resp, strOut)
 		return

+ 12 - 12
v4/lev3/mod_wui/mod_wui_test.go

@@ -27,7 +27,7 @@ const (
 type tester struct {
 	t        *testing.T
 	me       *mock_env.MockEnv
-	ctx      IKernelCtx
+	kCtx      IKernelCtx
 	fiberApp *fiber.App
 	mod      *ModuleWui
 }
@@ -36,7 +36,7 @@ func TestModKernelCtx(t *testing.T) {
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
-		ctx: kctx.GetKernelCtx().Hassert("TestModKernelCtx()"),
+		kCtx: kctx.GetKernelCtx(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
@@ -50,7 +50,7 @@ func TestModKernelCtx(t *testing.T) {
 	fnClear()
 
 	defer fnClear()
-	sf.ctx.Set("monolitName", "test_monolit", "test").Hassert("TestModKernelCtx()")
+	sf.kCtx.Set("monolitName", "test_monolit", "test")
 	sf.new()
 	sf.click()
 	sf.done()
@@ -69,7 +69,7 @@ func (sf *tester) click() {
 // С кривой POST-формой.
 func (sf *tester) clickBad3() {
 	sf.t.Log("clickBad3")
-	btn := wui_button.NewWuiButton("test_btn", sf.fnClick).Hassert("clickBad3()")
+	btn := wui_button.NewWuiButton("test_btn", sf.fnClick)
 	// Данные формы
 	reader := strings.NewReader("tra-ta-ta")
 	req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id(), reader)
@@ -97,7 +97,7 @@ func (sf *tester) clickBad3() {
 // С POST-формой.
 func (sf *tester) clickGood2() {
 	sf.t.Log("clickGood2")
-	btn := wui_button.NewWuiButton("test_btn", sf.fnClick).Hassert("clickGood2()")
+	btn := wui_button.NewWuiButton("test_btn", sf.fnClick)
 	// Данные формы
 	formData := url.Values{
 		"username": {"john_doe"},
@@ -131,7 +131,7 @@ func (sf *tester) clickGood2() {
 // Без POST-формы.
 func (sf *tester) clickGood1() {
 	sf.t.Log("clickGood1")
-	btn := wui_button.NewWuiButton("test_btn", sf.fnClick).Hassert("clickGood1()")
+	btn := wui_button.NewWuiButton("test_btn", sf.fnClick)
 	req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id(), nil)
 
 	if err != nil {
@@ -151,7 +151,7 @@ func (sf *tester) clickGood1() {
 }
 
 // Обратный вызов клика.
-func (sf *tester) fnClick(dict map[string]string) *mL0.Result[string] {
+func (sf *tester) fnClick(dict map[string]string) mL0.IResult[string] {
 	sf.t.Log("fnClick")
 	return mL0.NewRes("test_click")
 }
@@ -206,8 +206,8 @@ func (sf *tester) done() {
 		sf.t.Fatalf("done(): log is bad")
 	}
 
-	sf.ctx.Cancel()
-	sf.ctx.Wg().Wait()
+	sf.kCtx.Cancel()
+	sf.kCtx.Wg().Wait()
 
 	if isWork := sf.mod.IsWork(); isWork {
 		sf.t.Fatalf("done(): isWork==true")
@@ -228,9 +228,9 @@ func (sf *tester) newGood1() {
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18334/")
 
-	sf.mod = GetModuleWui().Hassert("newGood1()")
-	kCtx := kctx.GetKernelCtx().Hassert("newGood1()")
-	kCtx.Set("isLocal", true, "type msg bus").Hassert("newGood1()")
+	sf.mod = GetModuleWui()
+	kCtx := kctx.GetKernelCtx()
+	kCtx.Set("isLocal", true, "type msg bus")
 
 	_ = kmonolit.GetMonolit("test_monolit")
 	_ = GetModuleWui()