Przeglądaj źródła

SVI Рабочее сохранение

SVI 4 miesięcy temu
rodzic
commit
313ebedbbc
100 zmienionych plików z 769 dodań i 513 usunięć
  1. 12 1
      v4/docs/index.md
  2. 10 9
      v4/kern.go
  3. 10 6
      v4/kern_test.go
  4. 2 2
      v4/lev0/core_spec/estr.go
  5. 3 3
      v4/lev0/core_spec/ikernel_int.go
  6. 2 2
      v4/lev0/core_spec/ioption.go
  7. 2 2
      v4/lev0/core_spec/iresult.go
  8. 2 2
      v4/lev0/core_spec/isafe_bool.go
  9. 2 2
      v4/lev0/core_spec/isafe_bool_react.go
  10. 3 3
      v4/lev0/core_spec/isafe_string.go
  11. 96 16
      v4/lev0/defs/defs.go
  12. 3 3
      v4/lev0/defs/stream_name/stream_name.go
  13. 22 14
      v4/lev0/etypes/estr/estr.go
  14. 1 1
      v4/lev0/etypes/etypes.go
  15. 4 4
      v4/lev0/helpers/helpers.go
  16. 4 4
      v4/lev0/lev0.go
  17. 4 3
      v4/lev0/option/option.go
  18. 15 14
      v4/lev0/option/option_test.go
  19. 2 2
      v4/lev0/quark/quark.go
  20. 7 3
      v4/lev0/quark/quark_byte/quark_byte.go
  21. 8 4
      v4/lev0/quark/quark_byte/quark_byte_test.go
  22. 3 1
      v4/lev0/quark/quark_float/quark_float.go
  23. 9 5
      v4/lev0/quark/quark_float/quark_float_test.go
  24. 4 2
      v4/lev0/quark/quark_int/quark_int.go
  25. 9 5
      v4/lev0/quark/quark_int/quark_int_test.go
  26. 7 7
      v4/lev0/quark/quark_str/quark_str.go
  27. 11 6
      v4/lev0/quark/quark_str/quark_str_test.go
  28. 47 23
      v4/lev0/result/result.go
  29. 29 13
      v4/lev0/result/result_test.go
  30. 5 4
      v4/lev1/comp_spec/ilocal_ctx.go
  31. 10 10
      v4/lev1/kint/kint.go
  32. 2 2
      v4/lev1/lev1.go
  33. 8 8
      v4/lev1/local_ctx/ctx_value/ctx_value.go
  34. 4 3
      v4/lev1/local_ctx/ctx_value/ctx_value_test.go
  35. 16 16
      v4/lev1/local_ctx/local_ctx.go
  36. 6 6
      v4/lev1/local_ctx/local_ctx_test.go
  37. 15 15
      v4/lev1/log_buf/log_buf.go
  38. 11 7
      v4/lev1/log_buf/log_buf_test.go
  39. 1 1
      v4/lev1/log_buf/log_msg/log_msg.go
  40. 2 2
      v4/lev1/log_dict_topic/log_dict_topic.go
  41. 1 1
      v4/lev1/lst_sort/lst_sort.go
  42. 9 8
      v4/lev1/lst_sort/lst_sort_test.go
  43. 10 10
      v4/lev1/safe_bool/safe_bool.go
  44. 18 16
      v4/lev1/safe_bool_react/safe_bool_react.go
  45. 7 8
      v4/lev1/safe_int/safe_int.go
  46. 10 11
      v4/lev1/safe_string/safe_string.go
  47. 1 2
      v4/lev2/kchan/kchan.go
  48. 3 2
      v4/lev2/kctx/kctx.go
  49. 7 4
      v4/lev2/kctx/kctx_test.go
  50. 7 6
      v4/lev2/kernel_keeper/kernel_keeper.go
  51. 1 1
      v4/lev2/kmodule/kmodule.go
  52. 2 2
      v4/lev2/kmodule/kmodule_test.go
  53. 2 2
      v4/lev2/kmodule/mod_stat/mod_stat_test.go
  54. 12 10
      v4/lev2/kmonolit/kmonolit.go
  55. 6 3
      v4/lev2/kmonolit/kmonolit_test.go
  56. 12 12
      v4/lev2/kserv_http/kserv_http.go
  57. 3 3
      v4/lev2/kserv_http/kserv_http_test.go
  58. 7 5
      v4/lev2/kserv_http_std/kserv_http_std.go
  59. 9 6
      v4/lev2/kwg/kwg.go
  60. 4 2
      v4/lev2/lsi/kstore_kv/kstore_kv_test.go
  61. 1 4
      v4/lev2/lsi/store_ent/store_ent.go
  62. 2 2
      v4/lev2/lsi/store_spec/ibucket_base.go
  63. 4 4
      v4/lev2/lsi/store_spec/ikernel_store_kv.go
  64. 5 9
      v4/lev2/lti/bus_ent/handler_name/handler_name.go
  65. 1 2
      v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  66. 2 1
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go
  67. 2 1
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go
  68. 4 3
      v4/lev2/lti/dot/msg_serve/msg_serve.go
  69. 4 3
      v4/lev2/lti/dot/msg_unsub/msg_unsub.go
  70. 7 5
      v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook.go
  71. 7 6
      v4/lev2/lti/kbus/dict_topic_serve/dict_topic_serve.go
  72. 11 10
      v4/lev2/lti/kbus_base/kbus_base.go
  73. 27 23
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go
  74. 15 10
      v4/lev2/lti/kbus_http/kbus_http.go
  75. 3 2
      v4/lev2/wui/hx_url/hx_url.go
  76. 5 4
      v4/lev2/wui/hx_url_method/hx_url_method.go
  77. 5 4
      v4/lev2/wui/hx_url_patch/hx_url_patch.go
  78. 2 1
      v4/lev2/wui/wui.go
  79. 6 5
      v4/lev2/wui/wui_button/wui_button.go
  80. 1 1
      v4/lev2/wui/wui_button/wui_button_test.go
  81. 2 1
      v4/lev2/wui/wui_hx/wui_hx.go
  82. 6 5
      v4/lev2/wui/wui_label/wui_label.go
  83. 9 8
      v4/lev2/wui/wui_text/wui_text.go
  84. 4 2
      v4/lev2/wui/wui_types/ihx_url_method.go
  85. 4 2
      v4/lev2/wui/wui_types/ihx_url_patch.go
  86. 4 2
      v4/lev2/wui/wui_types/iwui_text.go
  87. 5 2
      v4/lev2/wui/wui_types/iwui_widget.go
  88. 8 7
      v4/lev2/wui/wui_widget/wui_widget.go
  89. 2 0
      v4/lev3/mod_ent/mod_ent.go
  90. 2 1
      v4/lev3/mod_ent/mod_num/mod_num.go
  91. 22 0
      v4/lev3/mod_ent/module_name/module_name.go
  92. 3 1
      v4/lev3/mod_kctx/mod_kctx.go
  93. 2 1
      v4/lev3/mod_kctx/mod_kctx_test.go
  94. 2 1
      v4/lev3/mod_keeper/mod_keeper_test.go
  95. 7 6
      v4/lev3/mod_serv_http/btn_modules/btn_modules.go
  96. 2 1
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go
  97. 2 3
      v4/lev3/mod_serv_http/http_api/http_api.go
  98. 6 5
      v4/lev3/mod_serv_http/page_module/page_module.go
  99. 12 10
      v4/lev3/mod_serv_http/page_monolit/page_monolit.go
  100. 7 5
      v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go

+ 12 - 1
v4/docs/index.md

@@ -111,4 +111,15 @@ kern — фреймворк для создания модульных комп
 - **v4** — текущая версия
 - **v3** — предыдущая версия
 
-**[Вернуться наверх ↑](#кern---модульные-компоненты)**
+## Сделать
+
+- перевести все базовые типы на внутренние
+- контрактные внутренние типы;
+- TUF сериализация/десериализация (собственная разработка, замена JSON);
+- сильное разделение на модули (WASI);
+- WASI модули (для надёжных модульных монолитов);
+- HTTP-сервер на stdlib (для PWA и WASM приложений);
+- KeyValue хранилище (собственная реализация);
+- KeyValue хранилище (поверх SQLite, надёжное);
+
+**[Вернуться наверх ↑](#кern---модульные-компоненты)**

+ 10 - 9
v4/kern.go

@@ -17,6 +17,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/kstore_kv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_http/client_bus_http"
@@ -40,7 +41,7 @@ func GetKernelCtx() kspec.IKernelCtx {
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) mL0.IResult[T] {
+func NewErr[T any](err defs.IErr) mL0.IResult[T] {
 	return mL0.NewErr[T](err)
 }
 
@@ -50,14 +51,14 @@ func NewOk[T any](res T) mL0.IResult[T] {
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res mL0.IResult[T], err error) mL0.IResult[T] {
+func WrapErr[T any](res mL0.IResult[T], err defs.IErr) mL0.IResult[T] {
 	return mL0.WrapErr(res, err)
 }
 
 // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра.
 //
 //go:fix inline
-func GetKernelStoreKv() kspec.IKernelStoreKv {
+func GetKernelStoreKv() store_spec.IKernelStoreKv {
 	store := kstore_kv.GetKernelStore()
 	return store
 }
@@ -83,7 +84,7 @@ func NewSafeBool(val bool) ISafeBool {
 // GetKernelBusLocal -- возвращает локальную шину данных.
 func GetKernelBusLocal() bus_spec.IKernelBus {
 	kCtx := kctx.GetKernelCtx()
-	kCtx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()")
+	kCtx.Set(defs.Str("monolitName"), "unknown monolit", defs.Str("GetKernelBusLocal()"))
 	lBus := kbus_local.GetKernelBusLocal()
 	return lBus
 }
@@ -106,10 +107,10 @@ func SleepMs() {
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
 func GetMonolitLocal(name mod_ent.AModuleName) mod_spec.IKernelMonolit {
 	kCtx := kctx.GetKernelCtx()
-	kCtx.Set("isLocal", true, "bus type")
+	kCtx.Set(defs.Str("isLocal"), true, defs.Str("bus type"))
 	for {
 		time.Sleep(time.Millisecond * 1)
-		optIsLocal := kCtx.Get("isLocal")
+		optIsLocal := kCtx.Get(defs.Str("isLocal"))
 		if optIsLocal.IsSome() {
 			break
 		}
@@ -123,10 +124,10 @@ func GetMonolitLocal(name mod_ent.AModuleName) mod_spec.IKernelMonolit {
 func GetMonolitHttp(name mod_ent.AModuleName) mod_spec.IKernelMonolit {
 	kCtx := kctx.GetKernelCtx()
 	_ = kbus_http.GetKernelBusHttp()
-	kCtx.Set("isLocal", false, "bus type")
+	kCtx.Set(defs.Str("isLocal"), false, defs.Str("bus type"))
 	for {
 		time.Sleep(time.Millisecond * 1)
-		optIsLocal := kCtx.Get("isLocal")
+		optIsLocal := kCtx.Get(defs.Str("isLocal"))
 		if optIsLocal.IsSome() {
 			break
 		}
@@ -154,7 +155,7 @@ func NewClientBusLocal() bus_spec.IBusClient {
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
 //
 //go:fix inline
-func NewClientBusHttp(url defs.Str) bus_spec.IBusClient {
+func NewClientBusHttp(url defs.AStr) bus_spec.IBusClient {
 	client := client_bus_http.NewClientBusHttp(url.String())
 	return client
 }

+ 10 - 6
v4/kern_test.go

@@ -1,17 +1,17 @@
 package kern
 
 import (
-	"fmt"
 	"os"
 	"testing"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 )
 
 const (
@@ -54,7 +54,7 @@ func (sf *tester) new() {
 	sf.new3()
 
 	_ = NewOk("test ok")
-	_ = NewErr[core_spec.EBool](fmt.Errorf("test err"))
+	_ = NewErr[core_spec.EBool](defs.NewErr("test err"))
 	_ = NewSome("test err")
 	_ = NewNone[int64]()
 
@@ -142,7 +142,7 @@ func (sf *tester) new1() {
 	if monHttp == nil {
 		sf.t.Fatalf("new1(): (http) IKernelMonolit==nil")
 	}
-	modName := module_name.IModuleNameFix(module_name.NewModuleName("test_mod"))
+	modName := mod_ent.NewModuleNameFix("test_mod")
 	mod := NewKernelModule(modName)
 	if mod == nil {
 		sf.t.Fatalf("new1(): IKernelModule==nil")
@@ -152,15 +152,19 @@ func (sf *tester) new1() {
 	if clientLocal == nil {
 		sf.t.Fatalf("new1(): (local) IBusClient==nil")
 	}
-	clientHttp := NewClientBusHttp("test_url")
+	clientHttp := NewClientBusHttp(defs.Str("test_url"))
 	if clientHttp == nil {
 		sf.t.Fatalf("new1(): (http) IBusClient==nil")
 	}
 }
 
+var(
+	str1=defs.Str("test_builders")
+)
+
 func (sf *tester) new0() {
 	store := GetKernelStoreKv()
-	res := store.Delete("test_builders")
+	res := store.Delete(str1)
 	if res.IsErr() {
 		sf.t.Fatalf("new0(): get empty key, store, err=%v", res.Err())
 	}

+ 2 - 2
v4/lev0/core_spec/estr.go

@@ -7,12 +7,12 @@ type EStr interface {
 	// SelfCheck -- выполняет самопроверку строки.
 	SelfCheck()
 	// Get -- возвращает строку.
-	Get() defs.Str
+	Get() defs.AStr
 }
 
 // EStrMut -- мутабельная расширенная строка.
 type EStrMut interface {
 	EStr
 	// Set -- устанавливает строку.
-	Set(defs.Str)
+	Set(defs.AStr)
 }

+ 3 - 3
v4/lev0/core_spec/ikernel_int.go

@@ -15,9 +15,9 @@ type Int interface {
 	// Dec -- уменьшает число на 1
 	Dec()
 	// FromStr -- устанавливает значение из строки
-	FromStr(defs.Str) IResult[defs.Int]
+	FromStr(defs.AStr) IResult[defs.Int]
 	// ToStr -- возвращает как строку
-	ToStr() defs.Str
+	ToStr() defs.AStr
 	// FromByte -- устанавливает значение из байтов
 	FromByte([]byte) IResult[defs.Int]
 	// ToByte -- возвращает как срез байт
@@ -27,5 +27,5 @@ type Int interface {
 	// ToBool -- возвращает как булево значение
 	ToBool() bool
 	// Getenv -- устанавливает значение из окружения
-	Getenv(defs.Str) IResult[defs.Int]
+	Getenv(defs.AStr) IResult[defs.Int]
 }

+ 2 - 2
v4/lev0/core_spec/ioption.go

@@ -15,7 +15,7 @@ type IOption[T any] interface {
 	// SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
 	SomeOrFn(fn func() T) T
 	// Hassert -- проверяет, что не пустое значение (с паникой).
-	Hassert(msgFormat defs.Str, args ...any) T
+	Hassert(msgFormat defs.AStr, args ...any) T
 	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-	Assert(msgFormat defs.Str, args ...any) T
+	Assert(msgFormat defs.AStr, args ...any) T
 }

+ 2 - 2
v4/lev0/core_spec/iresult.go

@@ -19,7 +19,7 @@ type IResult[T any] interface {
 	// Error -- возвращает строковое представление ошибки, если она есть.
 	Error() string
 	// Hassert -- проверяет, что нет ошибки (с паникой).
-	Hassert(msgFormat defs.Str, args ...any) T
+	Hassert(msgFormat defs.AStr, args ...any) T
 	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-	Assert(msgFormat defs.Str, args ...any) T
+	Assert(msgFormat defs.AStr, args ...any) T
 }

+ 2 - 2
v4/lev0/core_spec/isafe_bool.go

@@ -11,7 +11,7 @@ type ISafeBool interface {
 	// Reset -- сбрасывает хранимое потокобезопасное значение
 	Reset()
 	// FromStr -- устанавливает значение из строки
-	FromStr(defs.Str) IResult[EBool]
+	FromStr(defs.AStr) IResult[EBool]
 	// Getenv -- получает значение из окружения
-	Getenv(defs.Str) IResult[EBool]
+	Getenv(defs.AStr) IResult[EBool]
 }

+ 2 - 2
v4/lev0/core_spec/isafe_bool_react.go

@@ -8,7 +8,7 @@ import(
 type ISafeBoolReact interface {
 	ISafeBool
 	// Add -- добавляет функцию обратного вызова
-	Add(key defs.Str, fn func(EBoolMut)) IResult[EBool]
+	Add(key defs.AStr, fn func(EBoolMut)) IResult[EBool]
 	// Delete -- удаляет функцию обратного вызова по ключу
-	Delete(key defs.Str)
+	Delete(key defs.AStr)
 }

+ 3 - 3
v4/lev0/core_spec/isafe_string.go

@@ -5,13 +5,13 @@ import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 // ISafeString -- интерфейс к потокобезопасной переменной.
 type ISafeString interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
-	Get() defs.Str
+	Get() defs.AStr
 	// Set -- устанавливает хранимое потокобезопасное значение
-	Set(defs.Str)
+	Set(defs.AStr)
 	// Reset -- сбрасывает хранимое потокобезопасное значение
 	Reset()
 	// Byte -- возвращает байтовое представление строки
 	Byte() []byte
 	// Getenv -- устанавливает строку из переменной окружения
-	Getenv(defs.Str) IResult[defs.Str]
+	Getenv(defs.AStr) IResult[defs.AStr]
 }

+ 96 - 16
v4/lev0/defs/defs.go

@@ -1,7 +1,9 @@
 // package defs -- предметные типы ядра.
 package defs
 
-import "fmt"
+import (
+	"fmt"
+)
 
 // "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 
@@ -13,29 +15,69 @@ func (i Int) Int() int {
 	return int(i)
 }
 
-// IStr --интерфейс к гибкой строке
+// IStr --интерфейс к гибкой строке.
 type IStr interface {
 	// Str -- возвращает внутреннюю строку
-	Str() Str
+	Str() AStr
 	// String -- возвращает прямую строку
-	String()string
+	String() string
+	// Len -- возвращает длину внутренней строки
+	Len() Int
+	// Byte -- возвращает внутреннюю строку в виде байтов.
+	Byte() []byte
+	// Rune -- возвращает внутреннюю строку в виде рун.
+	Rune() []rune
 }
 
-// Str -- алиас для string.
-type Str string
+// Алиас для внутренней строки.
+type AStr string
+
+// Str -- создать новую строку.
+//
+//go:fix inline
+func Str(msg AStr, arg ...any) AStr {
+	return AStr(fmt.Sprintf(string(msg), arg...))
+}
 
 // NewStr -- создать новую строку.
-func NewStr(msg string, arg ...any) IStr {
-	return Str(fmt.Sprintf(msg, arg...))
+//
+//go:fix inline
+func NewStr(msg AStr) IStr {
+	return msg
+}
+
+// Rune -- возвращает внутреннюю строку в виде рун.
+//
+//go:fix inline
+func (s AStr) Rune() []rune {
+	return []rune(s)
+}
+
+// Byte -- возвращает внутреннюю строку в виде байтов.
+//
+//go:fix inline
+func (s AStr) Byte() []byte {
+	return []byte(s)
+}
+
+// Len -- возвращает длину строки.
+//
+//go:fix inline
+func (s AStr) Len() Int {
+	return Int(len(s))
 }
 
 // Str -- возвращает внутреннюю строку.
-func (s Str) Str() Str {
+//
+//go:fix inline
+func (s AStr) Str() AStr {
 	return s
 }
 
 // String -- возвращает строку по требованию.
-func (s Str) String() string {
+//
+//go:fix inline
+func (s AStr) String() string {
 	return string(s)
 }
 
@@ -43,6 +85,8 @@ func (s Str) String() string {
 type IErr interface {
 	error
 	IStr
+	// IsErr -- возвращает true, если ошибка.
+	IsErr() bool
 }
 
 // Err -- обёрнутая ошибка.
@@ -51,37 +95,73 @@ type Err struct {
 }
 
 // NewErr -- создать новую обёрнутую ошибку.
-func NewErr(msg Str, arg ...any) IErr {
-	err := fmt.Errorf(msg.String(), arg...)
+func NewErr(msg AStr, arg ...any) IErr {
+	err := fmt.Errorf(string(msg), arg...)
 	return &Err{err}
 }
 
 // WrapErr -- возвращает обёрнутую ошибку.
+//
+//go:fix inline
 func WrapErr(err error) IErr {
 	return &Err{err}
 }
 
+// Rune -- возвращает внутреннюю строку в виде рун.
+//
+//go:fix inline
+func (e *Err) Rune() []rune {
+	return []rune(e.err.Error())
+}
+
+// Byte -- возвращает байты из ошибки
+//
+//go:fix inline
+func (e *Err) Byte() []byte {
+	return []byte(e.err.Error())
+}
+
+// IsErr -- возвращает true, если ошибка.
+//
+//go:fix inline
+func (e *Err) IsErr() bool {
+	return e.err != nil
+}
+
 // String -- возвращает строковое представление ошибки.
+//
+//go:fix inline
 func (e *Err) String() string {
 	return e.err.Error()
 }
 
 // Error -- возвращает хранимую ошибку.
+//
+//go:fix inline
 func (e *Err) Error() string {
 	return e.err.Error()
 }
 
 // Str -- возвращает строку по требованию для ошибки.
-func (e *Err) Str() Str {
-	return Str(e.err.Error())
+//
+//go:fix inline
+func (e *Err) Str() AStr {
+	return AStr(e.err.Error())
+}
+
+// Len -- возвращает длину ошибки.
+//
+//go:fix inline
+func (e *Err) Len() Int {
+	return Int(len(e.err.Error()))
 }
 
 // Time -- метка времени.
 // Вывод: "2006-01-02 15:04:05.000 -07 MST".
-type Time Str
+type Time AStr
 
 // BucketName -- имя сущности.
-type BucketName Str
+type BucketName AStr
 
 // StreamName -- имя потока для ожидания.
 //

+ 3 - 3
v4/lev0/defs/stream_name/stream_name.go

@@ -7,11 +7,11 @@ import (
 
 // AStreamName -- имя потока для ожидания.
 type AStreamName struct {
-	val defs.Str
+	val defs.AStr
 }
 
 // NewAStreamName -- создать новое имя потока.
-func NewAStreamName(val defs.Str) *AStreamName {
+func NewAStreamName(val defs.AStr) *AStreamName {
 	helpers.Hassert(val != "", "NewAStreamName(): val is empty")
 	sf := &AStreamName{
 		val: val,
@@ -27,6 +27,6 @@ func (sf *AStreamName) String() string {
 }
 
 // Get -- получить значение.
-func (sf *AStreamName) Get() defs.Str {
+func (sf *AStreamName) Get() defs.AStr {
 	return sf.val
 }

+ 22 - 14
v4/lev0/etypes/estr/estr.go

@@ -9,35 +9,39 @@ import (
 
 // EStr -- расширенная строка.
 type EStr struct {
-	val    defs.Str // Хранимое значение
-	lenMin defs.Int    // Минимальная длина строки
-	lenMax defs.Int    // Максимальная длина строки
-	isMut  bool   // Признак мутабельности
+	val    defs.AStr // Хранимое значение
+	lenMin defs.Int  // Минимальная длина строки
+	lenMax defs.Int  // Максимальная длина строки
+	isMut  bool      // Признак мутабельности
 }
 
 // FnOptStr -- опции расширенной строки.
 type FnOptStr func(*EStr)
 
+//go:fix inline
+var msg1 = defs.AStr("EStr.OptStrMinLen: мин длина строки должна быть >= 0")
+
 // OptStrMinLen -- устанавливает минимальную длину строки.
 func OptStrMinLen(lenMin defs.Int) FnOptStr {
-	mHp.Hassert(lenMin >= 0,
-		"EStr.OptStrMinLen: минимальная длина строки должна быть больше или равна0")
+	mHp.Hassert(lenMin >= 0, msg1)
 	return func(sf *EStr) {
 		sf.lenMin = lenMin
 	}
 }
 
+//go:fix inline
+var msg2 = defs.AStr("EStr.OptStrMaxLen: макс длина строки должна быть >= 0")
+
 // OptStrMaxLen -- устанавливает максимальную длину строки.
 func OptStrMaxLen(lenMax defs.Int) FnOptStr {
 	return func(sf *EStr) {
-		mHp.Hassert(lenMax >= sf.lenMin,
-			"EStr.OptStrMaxLen: максимальная длина строки должна быть больше или равна0")
+		mHp.Hassert(lenMax >= sf.lenMin, msg2)
 		sf.lenMax = lenMax
 	}
 }
 
 // OptStr -- устанавливает начальное значение строки.
-func OptStr(val defs.Str) FnOptStr {
+func OptStr(val defs.AStr) FnOptStr {
 	return func(sf *EStr) {
 		sf.val = val
 	}
@@ -78,20 +82,24 @@ func NewStrMut(opt ...FnOptStr) mKs.EStrMut {
 }
 
 // Set -- устанавливает значение расширенной строки.
-func (sf *EStr) Set(val defs.Str) {
+func (sf *EStr) Set(val defs.AStr) {
 	mHp.Hassert(sf.isMut,
-		"EStrMut.Set(): нельзя изменить значение расширенной строки, если она не мутабельна, val=%q", val)
+		"EStrMut.Set(): нельзя изменить значение расширенной строки, если она не мутабельна, val=%q",
+		val.Str())
 	sf.val = val
 	sf.SelfCheck()
 }
 
 // SelfCheck -- самопроверка расширенной строки.
 func (sf *EStr) SelfCheck() {
-	mHp.Hassert(len(sf.val) < sf.lenMin.Int(), "EStr.SelfCheck(): строка не может быть %v", sf.lenMin)
-	mHp.Hassert(len(sf.val) > sf.lenMax.Int(), "EStr.SelfCheck(): строка не может быть длиннее %v", sf.lenMax)
+	mHp.Hassert(sf.val.Len() < sf.lenMin,
+		"EStr.SelfCheck(): строка не может быть %v", sf.lenMin)
+	mHp.Hassert(sf.val.Len() > sf.lenMax,
+		"EStr.SelfCheck(): строка не может быть длиннее %v",
+		sf.lenMax)
 }
 
 // Get -- возвращает хранимое значение расширенной строки.
-func (sf *EStr) Get() defs.Str {
+func (sf *EStr) Get() defs.AStr {
 	return sf.val
 }

+ 1 - 1
v4/lev0/etypes/etypes.go

@@ -27,7 +27,7 @@ func OptStrMaxLen(lenMax defs.Int) FnOptStr {
 }
 
 // OptStr -- устанавливает начальное значение строки.
-func OptStr(val defs.Str) FnOptStr {
+func OptStr(val defs.AStr) FnOptStr {
 	return estr.OptStr(val)
 }
 

+ 4 - 4
v4/lev0/helpers/helpers.go

@@ -20,10 +20,10 @@ var (
 // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
 //
 //	(isCond bool, msgFormat defs.Str, args ...any)
-type FnAssert func(isCond bool, msgFormat defs.Str, args ...any)
+type FnAssert func(isCond bool, msgFormat defs.AStr, args ...any)
 
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
-func Assert(isCond bool, msgFormat defs.Str, args ...any) {
+func Assert(isCond bool, msgFormat defs.AStr, args ...any) {
 	if isCond {
 		return
 	}
@@ -37,10 +37,10 @@ func Assert(isCond bool, msgFormat defs.Str, args ...any) {
 // FnHassert -- проверяет с жёстким падением условие.
 //
 //	(isCond bool, msgFormat defs.Str, args ...any)
-type FnHassert func(isCond bool, msgFormat defs.Str, args ...any)
+type FnHassert func(isCond bool, msgFormat defs.AStr, args ...any)
 
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
-func Hassert(isCond bool, msgFormat defs.Str, args ...any) {
+func Hassert(isCond bool, msgFormat defs.AStr, args ...any) {
 	if isCond {
 		return
 	}

+ 4 - 4
v4/lev0/lev0.go

@@ -26,12 +26,12 @@ func NewOk[T any](res T) IResult[T] {
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) IResult[T] {
+func NewErr[T any](err defs.IErr) IResult[T] {
 	return mRes.NewErr[T](err)
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res IResult[T], err error) IResult[T] {
+func WrapErr[T any](res IResult[T], err defs.IErr) IResult[T] {
 	return mRes.WrapErr(res, err)
 }
 
@@ -51,14 +51,14 @@ func NewNone[T any]() IOption[T] {
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
 //
 //go:fix inline
-func Hassert(isCond bool, msgFormat defs.Str, args ...any) {
+func Hassert(isCond bool, msgFormat defs.AStr, args ...any) {
 	helpers.Hassert(isCond, msgFormat, args)
 }
 
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
 //
 //go:fix inline
-func Assert(isCond bool, msgFormat defs.Str, args ...any) {
+func Assert(isCond bool, msgFormat defs.AStr, args ...any) {
 	helpers.Assert(isCond, msgFormat, args)
 }
 

+ 4 - 3
v4/lev0/option/option.go

@@ -18,7 +18,8 @@ func NewSome[T any](value T) mKs.IOption[T] {
 	// Для некоторых типов нужна дополнительная проверка через reflect
 	v := reflect.ValueOf(value)
 	switch v.Kind() {
-	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
+	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan,
+		reflect.Func, reflect.Interface:
 		mH.Hassert(!v.IsNil(), "NewSome[T any](): value==nil")
 	}
 	sf := &Option[T]{some: &value}
@@ -66,13 +67,13 @@ func (sf *Option[T]) SomeOrFn(fn func() T) T {
 }
 
 // Hassert -- проверяет, что не пустое значение (с паникой).
-func (sf *Option[T]) Hassert(msgFormat defs.Str, args ...any) T {
+func (sf *Option[T]) Hassert(msgFormat defs.AStr, args ...any) T {
 	mH.Hassert(sf.some != nil, msgFormat, args...)
 	return *sf.some
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-func (sf *Option[T]) Assert(msgFormat defs.Str, args ...any) T {
+func (sf *Option[T]) Assert(msgFormat defs.AStr, args ...any) T {
 	mH.Assert(sf.some != nil, msgFormat, args...)
 	return *sf.some
 }

+ 15 - 14
v4/lev0/option/option_test.go

@@ -33,29 +33,29 @@ func (sf *testerOption) createNoneGood1() {
 			sf.t.Fatalf("createNoneGood1(): panic=%v", _panic)
 		}
 	}()
-	opt := NewNone[defs.Str]()
+	opt := NewNone[defs.AStr]()
 	if opt.IsSome() {
 		sf.t.Fatalf("createNoneGood1(): is ok")
 	}
 	if !opt.IsNone() {
 		sf.t.Fatalf("createNoneGood1(): not err")
 	}
-	if val := opt.SomeOr("test2"); val != "test2" {
+	if val := opt.SomeOr("test2"); val.Str() != "test2" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.SomeOr("test1"); val != "test1" {
+	if val := opt.SomeOr("test1"); val.Str() != "test1" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.SomeOrFn(sf.fnWrap2); val != "test5" {
+	if val := opt.SomeOrFn(sf.fnWrap2); val.Str() != "test5" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	_opt := opt.(*Option[defs.Str])
+	_opt := opt.(*Option[defs.AStr])
 	sf.unwrapErr(_opt)
 	sf.hassert(_opt)
 	sf.assert(_opt)
 }
 
-func (sf *testerOption) assert(res *Option[defs.Str]) {
+func (sf *testerOption) assert(res *Option[defs.AStr]) {
 	sf.t.Log("assert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -65,7 +65,7 @@ func (sf *testerOption) assert(res *Option[defs.Str]) {
 	res.Hassert("test assert")
 }
 
-func (sf *testerOption) hassert(res *Option[defs.Str]) {
+func (sf *testerOption) hassert(res *Option[defs.AStr]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -75,7 +75,7 @@ func (sf *testerOption) hassert(res *Option[defs.Str]) {
 	res.Hassert("test hassert")
 }
 
-func (sf *testerOption) unwrapErr(res *Option[defs.Str]) {
+func (sf *testerOption) unwrapErr(res *Option[defs.AStr]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -85,7 +85,7 @@ func (sf *testerOption) unwrapErr(res *Option[defs.Str]) {
 	_ = res.Some()
 }
 
-const (
+var (
 	str = defs.Str("test val")
 )
 
@@ -106,10 +106,11 @@ func (sf *testerOption) createSomeGood2() {
 	if val := opt.Some(); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := opt.SomeOr("test1"); val != str {
+	strTest1:=defs.Str("test1")
+	if val := opt.SomeOr(strTest1); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := opt.SomeOr("test1"); val != "str" {
+	if val := opt.SomeOr(strTest1); val.Str() != "str" {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
 	if val := opt.SomeOrFn(sf.fnWrap); val != str {
@@ -120,12 +121,12 @@ func (sf *testerOption) createSomeGood2() {
 }
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *testerOption) fnWrap2() defs.Str {
+func (sf *testerOption) fnWrap2() defs.AStr {
 	return "test5"
 }
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *testerOption) fnWrap() defs.Str {
+func (sf *testerOption) fnWrap() defs.AStr {
 	return "test1"
 }
 
@@ -148,6 +149,6 @@ func (sf *testerOption) createSomeBad1() {
 			sf.t.Fatalf("createSomeBad1(): panic==nil")
 		}
 	}()
-	var str *defs.Str
+	var str defs.AStr
 	_ = NewSome(str)
 }

+ 2 - 2
v4/lev0/quark/quark.go

@@ -19,13 +19,13 @@ type CMod = quark_val.CMod
 type QStr[M CMod] = quark_str.QStr[M]
 
 // NewQStr -- создает новый экземпляр QStr.
-func NewQStr(val defs.Str) *QStr[Fix] {
+func NewQStr(val defs.AStr) *QStr[Fix] {
 	val_ := quark_str.NewQStr(val)
 	return val_
 }
 
 // NewQStrMut -- создает новый экземпляр QStrMut.
-func NewQStrMut(val defs.Str) *QStr[Mut] {
+func NewQStrMut(val defs.AStr) *QStr[Mut] {
 	val_ := quark_str.NewQStrMut(val)
 	return val_
 }

+ 7 - 3
v4/lev0/quark/quark_byte/quark_byte.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"strconv"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
@@ -65,7 +66,8 @@ func (sf *QByte[T]) ToStr() string {
 
 // FromInt -- установить значение из int.
 func FromInt(sf *QByte[quark_val.Mut], v int) {
-	mKh.Hassert(v >= 0 && v <= 255, "QByte.FromInt(): значение вне диапазона байта")
+	mKh.Hassert(v >= 0 && v <= 255,
+		defs.Str("QByte.FromInt(): значение вне диапазона байта"))
 	quark_val.Set(sf.Val(), byte(v))
 }
 
@@ -75,7 +77,9 @@ func FromInt(sf *QByte[quark_val.Mut], v int) {
 func FromStr(sf *QByte[quark_val.Mut], s string) {
 	// Конвертируем строку в int и используем FromInt для всех проверок
 	v, err := strconv.Atoi(s)
-	mKh.Hassert(err == nil, "QByte.FromStr(): не удалось преобразовать строку в int, err=\n\t%v", err)
-	mKh.Hassert(v >= 0 && v <= 255, "QByte.FromInt(): значение вне диапазона байта")
+	mKh.Hassert(err == nil,
+		defs.Str("QByte.FromStr(): не удалось преобразовать строку в int, err=\n\t%v", err))
+	mKh.Hassert(v >= 0 && v <= 255,
+		defs.Str("QByte.FromInt(): значение вне диапазона байта"))
 	quark_val.Set(sf.Val(), byte(v))
 }

+ 8 - 4
v4/lev0/quark/quark_byte/quark_byte_test.go

@@ -1,10 +1,12 @@
 package quark_byte
 
 import (
-	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 	"strconv"
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 )
 
 type tester struct {
@@ -77,7 +79,8 @@ func (sf *tester) convertInt() {
 	}
 
 	const newIntVal = 200
-	mKh.Hassert(newIntVal >= 0 && newIntVal <= 255, "QByte.FromInt(): значение вне диапазона байта")
+	mKh.Hassert(newIntVal >= 0 && newIntVal <= 255,
+		defs.Str("QByte.FromInt(): значение вне диапазона байта"))
 	quark_val.Set(qb.Val(), byte(newIntVal))
 	if qb.Get() != byte(newIntVal) {
 		sf.t.Fatalf("convertInt(): FromInt() установил %d, ожидали %d", qb.Get(), byte(newIntVal))
@@ -103,7 +106,8 @@ func (sf *tester) convertStr() {
 	// FromStr использует StrToInt, поэтому передаём числовую строку
 	const newIntVal = 13
 	v, err := strconv.Atoi("13")
-	mKh.Hassert(err == nil, "QByte.FromStr(): не удалось преобразовать строку в int, err=\n\t%v", err)
+	mKh.Hassert(err == nil,
+		defs.Str("QByte.FromStr(): не удалось преобразовать строку в int, err=\n\t%v", err))
 	//go:fix inline
 	FromInt(qb, v)
 	if qb.Get() != byte(newIntVal) {

+ 3 - 1
v4/lev0/quark/quark_float/quark_float.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"strconv"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
@@ -50,7 +51,8 @@ func Set(sf *QFloat[quark_val.Mut], val float64) {
 //go:fix inline
 func FromStr(sf *QFloat[quark_val.Mut], str string) {
 	fVal, err := strconv.ParseFloat(str, 64)
-	mKh.Hassert(err == nil, "QFloat.FromStr(): str=%q, err=\n\t%v", str, err)
+	mKh.Hassert(err == nil,
+		defs.Str("QFloat.FromStr(): str=%q, err=\n\t%v", str, err))
 	quark_val.Set(sf.Val(), fVal)
 }
 

+ 9 - 5
v4/lev0/quark/quark_float/quark_float_test.go

@@ -1,12 +1,15 @@
 package quark_float
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
+import (
+	"strconv"
 
-import "strconv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 
-import mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"testing"
 
-import "testing"
+	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+)
 
 type tester struct {
 	t *testing.T
@@ -33,7 +36,8 @@ func (sf *tester) newMut() {
 	}
 	var str = "12.1"
 	fVal, err := strconv.ParseFloat(str, 64)
-	mKh.Hassert(err == nil, "QFloat.FromStr(): str=%q, err=\n\t%v", str, err)
+	mKh.Hassert(err == nil,
+		defs.Str("QFloat.FromStr(): str=%q, err=\n\t%v", str, err))
 	quark_val.Set(qf.Val(), fVal)
 	if qf.Get() != 12.1 {
 		sf.t.Fatalf("FromStr(qf, \"12.1\"): qf.Get()=%v", qf.Get())

+ 4 - 2
v4/lev0/quark/quark_int/quark_int.go

@@ -4,6 +4,7 @@ package quark_int
 import (
 	"strconv"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
@@ -53,7 +54,8 @@ func Set(sf *QInt[quark_val.Mut], v int) {
 //go:fix inline
 func FromStr(sf *QInt[quark_val.Mut], s string) {
 	iVal, err := strconv.Atoi(s)
-	mKh.Hassert(err == nil, "QInt.FromStr(): не удалось преобразовать строку(%v) в int, err=\n\t%v",
-		s, err)
+	mKh.Hassert(err == nil,
+		defs.Str("QInt.FromStr(): не удалось преобразовать строку(%v) в int, err=\n\t%v",
+		s, err))
 	quark_val.Set(sf.Val(), iVal)
 }

+ 9 - 5
v4/lev0/quark/quark_int/quark_int_test.go

@@ -1,12 +1,15 @@
 package quark_int
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
+import (
+	"strconv"
 
-import "strconv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 
-import mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"testing"
 
-import "testing"
+	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+)
 
 type tester struct {
 	t *testing.T
@@ -33,7 +36,8 @@ func (sf *tester) newMut() {
 	}
 	var s = "300"
 	iVal, err := strconv.Atoi(s)
-	mKh.Hassert(err == nil, "QInt.FromStr(): не удалось преобразовать строку(%v) в int, err=\n\t%v", s, err)
+	mKh.Hassert(err == nil,
+		defs.Str("QInt.FromStr(): не удалось преобразовать строку(%v) в int, err=\n\t%v", s, err))
 	quark_val.Set(qi.Val(), iVal)
 	if qi.Get() != 300 {
 		sf.t.Fatalf("newMut(): qi.Get()=%d", qi.Get())

+ 7 - 7
v4/lev0/quark/quark_str/quark_str.go

@@ -9,12 +9,12 @@ import (
 
 // QStr -- кварк строки.
 type QStr[M quark_val.CMod] struct {
-	*quark_base.QBase[M, defs.Str]
+	*quark_base.QBase[M, defs.AStr]
 }
 
 // NewQStr -- создает фиксированную новую кварк строку.
-func NewQStr(val defs.Str) *QStr[quark_val.Fix] {
-	optMass := quark_base.QBaseOptMass[quark_val.Fix, defs.Str](len(val))
+func NewQStr(val defs.AStr) *QStr[quark_val.Fix] {
+	optMass := quark_base.QBaseOptMass[quark_val.Fix, defs.AStr](val.Len().Int())
 	optVal := quark_base.QBaseOptVal(val)
 	sf := &QStr[quark_val.Fix]{
 		QBase: quark_base.NewQBase(optMass, optVal),
@@ -23,8 +23,8 @@ func NewQStr(val defs.Str) *QStr[quark_val.Fix] {
 }
 
 // NewQStrMut -- создает мутабельную новую кварк строку.
-func NewQStrMut(val defs.Str) *QStr[quark_val.Mut] {
-	optMass := quark_base.QBaseOptMass[quark_val.Mut, defs.Str](len(val))
+func NewQStrMut(val defs.AStr) *QStr[quark_val.Mut] {
+	optMass := quark_base.QBaseOptMass[quark_val.Mut, defs.AStr](val.Len().Int())
 	optVal := quark_base.QBaseOptValMut(val)
 	sf := &QStr[quark_val.Mut]{
 		QBase: quark_base.NewQBaseMut(optMass, optVal),
@@ -35,13 +35,13 @@ func NewQStrMut(val defs.Str) *QStr[quark_val.Mut] {
 // Get -- возвращает хранимое значение.
 //
 //go:fix inline
-func (sf *QStr[M]) Get() defs.Str {
+func (sf *QStr[M]) Get() defs.AStr {
 	return sf.Val().Get()
 }
 
 // Set -- устанавливает хранимое значение.
 //
 //go:fix inline
-func Set(sf *QStr[quark_val.Mut], val defs.Str) {
+func Set(sf *QStr[quark_val.Mut], val defs.AStr) {
 	quark_val.Set(sf.Val(), val)
 }

+ 11 - 6
v4/lev0/quark/quark_str/quark_str_test.go

@@ -1,8 +1,11 @@
 package quark_str
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
+import (
+	"testing"
 
-import "testing"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
+)
 
 type tester struct {
 	t *testing.T
@@ -16,12 +19,14 @@ func TestQStr(t *testing.T) {
 	sf.newMut()
 }
 
+
+
 // Создание строки с мутацией.
 func (sf *tester) newMut() {
 	sf.t.Log("newMut")
 	qs := NewQStrMut("test")
-	quark_val.Set(qs.Val(), "test2")
-	if qs.Get() != "test2" {
+	quark_val.Set(qs.Val(), "test")
+	if qs.Get().Str() != "test2" {
 		sf.t.Fatalf("newMut(): bad value")
 	}
 }
@@ -29,8 +34,8 @@ func (sf *tester) newMut() {
 // Создание неизменяемой строки.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	qs := NewQStr("test")
-	if qs.Get() != "test" {
+	qs := NewQStr(defs.Str("test"))
+	if qs.Get().Str() != "test" {
 		sf.t.Fatalf("new(): bad value")
 	}
 }

+ 47 - 23
v4/lev0/result/result.go

@@ -1,7 +1,6 @@
 package result
 
 import (
-	"fmt"
 	"reflect"
 	"runtime"
 
@@ -16,16 +15,20 @@ import (
 type Result[T any] struct {
 	val     T     // Полезное значение
 	isCheck bool  // Если проверено
-	err     error // Ошибка
+	err     defs.IErr // Ошибка
 }
 
+var (
+	str5 = defs.Str("NewOk(): result==nil")
+)
+
 // NewOk -- возвращает успешный Result с значением.
 func NewOk[T any](result T) mKs.IResult[T] {
 	// Для некоторых типов нужна дополнительная проверка через reflect
 	v := reflect.ValueOf(result)
 	switch v.Kind() {
 	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
-		mKh.Hassert(!v.IsNil(), "NewOk(): result==nil")
+		mKh.Hassert(!v.IsNil(), str5.Str())
 	}
 	sf := &Result[T]{
 		val: result,
@@ -34,9 +37,13 @@ func NewOk[T any](result T) mKs.IResult[T] {
 	return sf
 }
 
+var(
+	str6= defs.Str("NewErr(): err==nil")
+)
+
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) mKs.IResult[T] {
-	mKh.Hassert(err != nil, "NewError(): err==nil")
+func NewErr[T any](err defs.IErr) mKs.IResult[T] {
+	mKh.Hassert(err != nil, str6.Str())
 	sf := &Result[T]{
 		err: err,
 	}
@@ -44,19 +51,28 @@ func NewErr[T any](err error) mKs.IResult[T] {
 	return sf
 }
 
+var(
+	str7=defs.Str("WrapErr(): result not have error")
+	str8=defs.Str("WrapErr(): err==nil")
+)
+
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res mKs.IResult[T], err error) mKs.IResult[T] {
-	mKh.Hassert(res.IsErr(), "WrapErr(): result not have error")
-	mKh.Hassert(err != nil, "WrapErr(): err==nil")
+func WrapErr[T any](res mKs.IResult[T], err defs.IErr) mKs.IResult[T] {
+	mKh.Hassert(res.IsErr(), str7.Str())
+	mKh.Hassert(err != nil, str8.Str())
 	err0 := res.Err() // Чтобы не было паники при финализации и обернуть ошибку
-	err = fmt.Errorf("%v, err=\n\t%w", err0, err)
+	err = defs.NewErr("%v, err=\n\t%w", err0, err)
 	sf := NewErr[T](err)
 	return sf
 }
 
+var(
+	str9=defs.Str("Result[T].destroy(): err not checked")
+)
+
 func (sf *Result[T]) destroy(res *Result[T]) {
 	if !res.isCheck {
-		mKh.Hassert(false, "Result[T].destroy(): err not checked")
+		mKh.Hassert(false, str9.Str())
 	}
 }
 
@@ -74,7 +90,7 @@ func (sf *Result[T]) IsErr() bool {
 
 // Ok -- возвращает значение, если оно есть, иначе паникует.
 func (sf *Result[T]) Ok() T {
-	mKh.Hassert(sf.err == nil, "Result[T].Ok(): err(%v)!=nil", sf.err.Error())
+	mKh.Hassert(sf.err == nil, defs.NewErr("Result[T].Ok(): err!=nil, err=\n\t%w", sf.err))
 	sf.isCheck = true
 	return sf.val
 }
@@ -89,9 +105,13 @@ func (sf *Result[T]) OkOr(defaultValue T) T {
 	return sf.Ok()
 }
 
+var(
+	str11=defs.Str("Result[T].OkOrFn(): fn==nil")
+)
+
 // OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
 func (sf *Result[T]) OkOrFn(fn func() T) T {
-	mKh.Hassert(fn != nil, "Result[T].OkOrFn(): fn==nil")
+	mKh.Hassert(fn != nil, str11.Str())
 	sf.isCheck = true
 	if sf.err != nil {
 		sf.val = fn()
@@ -100,39 +120,43 @@ func (sf *Result[T]) OkOrFn(fn func() T) T {
 	return sf.Ok()
 }
 
+var(
+	str12=defs.Str("Result[T].Err(): err==nil")
+)
+
 // Err -- возвращает ошибку, если она есть.
 func (sf *Result[T]) Err() error {
-	mKh.Hassert(sf.err != nil, "Result[T].Err(): err==nil")
+	mKh.Hassert(sf.err != nil, str12.Str())
 	sf.isCheck = true
 	return sf.err
 }
 
 // Error -- возвращает строковое представление ошибки, если она есть.
 func (sf *Result[T]) Error() string {
-	mKh.Hassert(sf.err != nil, "Result[T].Error(): err==nil")
+	mKh.Hassert(sf.err != nil, defs.Str("Result[T].Error(): err==nil"))
 	sf.isCheck = true
 	return sf.err.Error()
 }
 
 // Hassert -- проверяет, что нет ошибки (с паникой).
-func (sf *Result[T]) Hassert(msgFormat defs.Str, args ...any) T {
-	strErr := ""
+func (sf *Result[T]) Hassert(msgFormat defs.AStr, args ...any) T {
+	strErr := defs.AStr("")
 	if !sf.isCheck {
-		strErr = fmt.Sprintf(", err=\n\t%v", sf.err)
+		strErr = defs.Str(", err=\n\t%v", sf.err).Str()
 	}
-	msg := fmt.Sprintf(msgFormat.String()+strErr, args...)
-	mKh.Hassert(sf.err == nil, defs.Str(msg))
+	msg := defs.Str(msgFormat+strErr, args...)
+	mKh.Hassert(sf.err == nil, msg)
 	sf.isCheck = true
 	return sf.val
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-func (sf *Result[T]) Assert(msgFormat defs.Str, args ...any) T {
-	strErr := ""
+func (sf *Result[T]) Assert(msgFormat defs.AStr, args ...any) T {
+	strErr := defs.Str("").Str()
 	if !sf.isCheck {
-		strErr = fmt.Sprintf(", err=\n\t%v", sf.err)
+		strErr = defs.Str(", err=\n\t%v", sf.err).Str()
 	}
-	msg := fmt.Sprintf(msgFormat.String()+strErr, args...)
+	msg := defs.NewErr(msgFormat+strErr, args...)
 	mKh.Assert(sf.err == nil, defs.Str(msg))
 	sf.isCheck = true
 	return sf.val

+ 29 - 13
v4/lev0/result/result_test.go

@@ -1,7 +1,6 @@
 package result
 
 import (
-	"fmt"
 	"runtime"
 	"testing"
 
@@ -22,6 +21,10 @@ func TestResult(t *testing.T) {
 
 }
 
+var(
+	str1=defs.Str("test")
+)
+
 // Создаёт новый результат и не проверяет его.
 func (sf *tester) notCheck() {
 	sf.t.Log("notCheck")
@@ -30,16 +33,16 @@ func (sf *tester) notCheck() {
 			sf.t.Fatalf("notCheck(): panic==nil")
 		}
 	}()
-	res := NewOk(defs.Str("test"))
+	res := NewOk(str1)
 	{
 		val := res.Ok()
-		if val != "test" {
+		if val != str1 {
 			sf.t.Fatalf("notCheck() test!=test")
 		}
 	}
 	runtime.Gosched()
 	runtime.GC()
-	_res := res.(*Result[defs.Str])
+	_res := res.(*Result[defs.AStr])
 	_res.destroy(_res)
 }
 
@@ -60,7 +63,7 @@ func (sf *tester) createErrGood1() {
 			sf.t.Fatalf("createErrGood1(): panic=%v", _panic)
 		}
 	}()
-	err := fmt.Errorf("test err")
+	err := defs.NewErr("test err")
 	res := NewErr[string](err)
 	if res.IsOk() {
 		sf.t.Fatalf("createErrGood1(): is ok")
@@ -99,18 +102,26 @@ func (sf *tester) createErrGood1() {
 	sf.assert2()
 }
 
+var(
+	str2=defs.Str("test assert2")
+)
+
 func (sf *tester) assert2() {
 	sf.t.Log("assert2")
-	err := fmt.Errorf("test_error")
+	err := defs.NewErr("test_error")
 	res := NewErr[mKs.EBool](err)
 	defer func() {
 		if _panic := recover(); _panic == nil {
 			sf.t.Fatalf("assert2(): panic==nil")
 		}
 	}()
-	res.Assert("test assert2")
+	res.Assert(str2)
 }
 
+var(
+	str3=defs.Str("test hassert2")
+)
+
 func (sf *tester) hassert2(res mKs.IResult[string]) {
 	sf.t.Log("hassert2")
 	defer func() {
@@ -118,9 +129,13 @@ func (sf *tester) hassert2(res mKs.IResult[string]) {
 			sf.t.Fatalf("assert(): panic==nil")
 		}
 	}()
-	res.Hassert("test hassert2")
+	res.Hassert(str3)
 }
 
+var(
+	str4=defs.Str("test assert")
+)
+
 func (sf *tester) hassert(res mKs.IResult[string]) {
 	sf.t.Log("hassert")
 	defer func() {
@@ -128,7 +143,7 @@ func (sf *tester) hassert(res mKs.IResult[string]) {
 			sf.t.Fatalf("hassert(): panic==nil")
 		}
 	}()
-	res.Hassert("test hassert")
+	res.Hassert(str4)
 }
 
 func (sf *tester) unwrapErr(res mKs.IResult[string]) {
@@ -149,7 +164,7 @@ func (sf *tester) createErrBad1() {
 			sf.t.Fatalf("createErrBad1(): panic==nil")
 		}
 	}()
-	var err error
+	var err defs.IErr
 	_ = NewErr[mKs.EBool](err)
 }
 
@@ -183,12 +198,13 @@ func (sf *tester) createOkGood2() {
 	if val := res.OkOrFn(sf.fnWrap); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	res0 := NewErr[any](fmt.Errorf("test_error"))
+	res0 := NewErr[any](defs.NewErr("test_error"))
 	if err := res0.Err(); err == nil {
 		sf.t.Fatalf("createOkGood1(): err==nil")
 	}
-	res.Hassert("test")
-	res.Assert("test")
+	str1:=defs.Str("test assert")
+	res.Hassert(str1)
+	res.Assert(str1)
 }
 
 // Функция высшего порядка для замещения ошибки.

+ 5 - 4
v4/lev1/comp_spec/ilocal_ctx.go

@@ -4,6 +4,7 @@ import (
 	"context"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value"
 )
 
@@ -14,13 +15,13 @@ type ICtxValue = ctx_value.ICtxValue
 type ILocalCtx interface {
 	core_spec.IRWMutex
 	// Get -- извлекает значение из контекста
-	Get(key string) core_spec.IOption[ICtxValue]
+	Get(key defs.AStr) core_spec.IOption[ICtxValue]
 	// Del -- удаляет значение из контекста
-	Del(key string)
+	Del(key defs.AStr)
 	// Set -- добавляет значение в контекст
-	Set(key string, val any, comment string)
+	Set(key defs.AStr, val any, comment defs.AStr)
 	// Size -- возвращает размер словаря контекста
-	Size() int
+	Size() defs.Int
 	// SortedList -- возвращает сортированный список объектов контекста
 	SortedList() []ICtxValue
 	// Cancel -- отменяет контекст

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

@@ -4,11 +4,11 @@ package kint
 import (
 	"bytes"
 	"encoding/binary"
-	"fmt"
 	"os"
 	"strconv"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
@@ -52,10 +52,10 @@ func (sf *KernInt) Reset() {
 }
 
 // FromStr -- устанавливает значение из строки.
-func (sf *KernInt) FromStr(strVal defs.Str) mL0.IResult[defs.Int] {
+func (sf *KernInt) FromStr(strVal defs.AStr) mL0.IResult[defs.Int] {
 	iVal, err := strconv.Atoi(strVal.String())
 	if err != nil {
-		err := fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err)
+		err := defs.NewErr("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err)
 		return mL0.NewErr[defs.Int](err)
 	}
 	sf.val = defs.Int(iVal)
@@ -63,22 +63,22 @@ func (sf *KernInt) FromStr(strVal defs.Str) mL0.IResult[defs.Int] {
 }
 
 // ToStr -- возвращает как строку.
-func (sf *KernInt) ToStr() defs.Str {
-	return defs.Str(fmt.Sprint(sf.val))
+func (sf *KernInt) ToStr() defs.AStr {
+	return defs.Str("%v", sf.val)
 }
 
 // FromByte -- устанавливает значение из байтов (BigEndian, net order).
 func (sf *KernInt) FromByte(binData []byte) mL0.IResult[defs.Int] {
 	lenBin := len(binData)
 	if lenBin < 8 {
-		err := fmt.Errorf("KInt.FromByte(): len(%v) bytes shorts", lenBin)
+		err := defs.NewErr("KInt.FromByte(): len(%v) bytes shorts", lenBin)
 		return mL0.NewErr[defs.Int](err)
 	}
 	var signed int64
 	buf := bytes.NewReader(binData)
 	err := binary.Read(buf, binary.BigEndian, &signed)
 	if err != nil {
-		err := fmt.Errorf("KInt.FromByte(): in read []byte, err=\n\t%w", err)
+		err := defs.NewErr("KInt.FromByte(): in read []byte, err=\n\t%w", err)
 		return mL0.NewErr[defs.Int](err)
 	}
 	sf.val = defs.Int(signed)
@@ -108,11 +108,11 @@ func (sf *KernInt) ToBool() bool {
 }
 
 // Getenv -- устанавливает значение из окружения.
-func (sf *KernInt) Getenv(env defs.Str) mL0.IResult[defs.Int] {
+func (sf *KernInt) Getenv(env defs.AStr) core_spec.IResult[defs.Int] {
 	strVal := os.Getenv(env.String())
-	res := sf.FromStr(defs.Str(strVal))
+	res := sf.FromStr(defs.AStr(strVal))
 	if res.IsErr() {
-		err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
+		err := defs.NewErr("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
 		return mL0.NewErr[defs.Int](err)
 	}
 	return mL0.NewOk(sf.val)

+ 2 - 2
v4/lev1/lev1.go

@@ -45,12 +45,12 @@ func NewSafeString() mKs.ISafeString {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(strVal defs.Str) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntFromStr(strVal defs.AStr) mL0.IResult[mKs.ISafeInt] {
 	return safe_int.NewSafeIntFromStr(strVal)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env defs.Str) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntGetenv(env defs.AStr) mL0.IResult[mKs.ISafeInt] {
 	return safe_int.NewSafeIntGetenv(env)
 }
 

+ 8 - 8
v4/lev1/local_ctx/ctx_value/ctx_value.go

@@ -14,7 +14,7 @@ import (
 type ICtxValue interface {
 	core_spec.IRWMutex
 	// Key -- возвращает ключ значения
-	Key() defs.Str
+	Key() defs.AStr
 	// Val -- возвращает хранимое значение
 	Val() any
 	// CreateAt -- возвращает метку времени создания
@@ -22,22 +22,22 @@ type ICtxValue interface {
 	// UpdateAt -- возвращает метку времени обновления
 	UpdateAt() core_spec.ITimeMut
 	// Comment -- возвращает комментарий значения
-	Comment() defs.Str
+	Comment() defs.AStr
 }
 
 // CtxValue -- потокобезопасное значение локального контекста.
 type CtxValue struct {
 	sync.RWMutex
-	key       defs.Str
+	key       defs.AStr
 	createAt  core_spec.ITime
 	Val_      any
 	UpdateAt_ core_spec.ITimeMut
-	Comment_  defs.Str
+	Comment_  defs.AStr
 }
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
-func NewCtxValue(key defs.Str, val any, comment defs.Str) ICtxValue {
-	helpers.Hassert(key != "", "NewCtxValue(): key is empty", []any{})
+func NewCtxValue(key defs.AStr, val any, comment defs.AStr) ICtxValue {
+	helpers.Hassert(key.Str() != "", "NewCtxValue(): key is empty", []any{})
 	sf := &CtxValue{
 		key:       key,
 		createAt:  etime.NewETimeAuto(),
@@ -49,7 +49,7 @@ func NewCtxValue(key defs.Str, val any, comment defs.Str) ICtxValue {
 }
 
 // Key -- возвращает ключ значения.
-func (sf *CtxValue) Key() string {
+func (sf *CtxValue) Key() defs.AStr {
 	return sf.key
 }
 
@@ -73,7 +73,7 @@ func (sf *CtxValue) CreateAt() core_spec.ITime {
 }
 
 // Comment -- возвращает комментарий значения.
-func (sf *CtxValue) Comment() string {
+func (sf *CtxValue) Comment() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.Comment_

+ 4 - 3
v4/lev1/local_ctx/ctx_value/ctx_value_test.go

@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
 type tester struct {
@@ -22,7 +23,7 @@ func TestCtxValue(t *testing.T) {
 // Создаёт значение локального контекста.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.val = NewCtxValue("test_key", 5, "test_value")
+	sf.val = NewCtxValue(defs.Str("test_key"), 5, defs.Str("test_value"))
 	if sf.val == nil {
 		sf.t.Fatalf("new(): val==nil")
 	}
@@ -34,10 +35,10 @@ func (sf *tester) new() {
 		sf.t.Fatalf("new(): create is empty")
 	}
 	sf.createdAt = create
-	if comment := sf.val.Comment(); comment != "test_value" {
+	if comment := sf.val.Comment(); comment.Str() != "test_value" {
 		sf.t.Fatalf("new(): comment(%v)!='test_value'", comment)
 	}
-	if key := sf.val.Key(); key != "test_key" {
+	if key := sf.val.Key(); key.Str() != "test_key" {
 		sf.t.Fatalf("new(): key(%v)!='test_key'", key)
 	}
 	if update := sf.val.UpdateAt(); update.Get() != "" {

+ 16 - 16
v4/lev1/local_ctx/local_ctx.go

@@ -22,13 +22,13 @@ import (
 type ILocalCtx interface {
 	core_spec.IRWMutex
 	// Get -- извлекает значение из контекста
-	Get(key string) core_spec.IOption[comp_spec.ICtxValue]
+	Get(key defs.AStr) core_spec.IOption[comp_spec.ICtxValue]
 	// Del -- удаляет значение из контекста
-	Del(key string)
+	Del(key defs.AStr)
 	// Set -- добавляет значение в контекст
-	Set(key string, val any, comment string)
+	Set(key defs.AStr, val any, comment defs.AStr)
 	// Size -- возвращает размер словаря контекста
-	Size() int
+	Size() defs.Int
 	// SortedList -- возвращает сортированный список объектов контекста
 	SortedList() []comp_spec.ICtxValue
 	// Cancel -- отменяет контекст
@@ -47,7 +47,7 @@ type LocalCtx struct {
 	ctx      context.Context // Отменяемый контекст
 	fnCancel func()          // Функция отмены контекста
 
-	dictVal map[defs.Str]comp_spec.ICtxValue // Словарь различных значений
+	dictVal map[defs.AStr]comp_spec.ICtxValue // Словарь различных значений
 	lstSort *lst_sort.LstSort              // Сортированный список значений
 	log     comp_spec.ILogBuf              // Локальный буфер
 }
@@ -63,7 +63,7 @@ func NewLocalCtx(ctx context.Context) ILocalCtx {
 	sf := &LocalCtx{
 		ctx:      _ctx,
 		fnCancel: fnCancel,
-		dictVal:  map[defs.Str]comp_spec.ICtxValue{},
+		dictVal:  map[defs.AStr]comp_spec.ICtxValue{},
 		lstSort:  lst_sort.NewLstSort(),
 		log:      log_buf.NewLogBuf(paramLogBuf),
 	}
@@ -93,13 +93,13 @@ func (sf *LocalCtx) Log() comp_spec.ILogBuf {
 }
 
 // Get -- возвращает хранимое значение.
-func (sf *LocalCtx) Get(key defs.Str) mL0.IOption[comp_spec.ICtxValue] {
+func (sf *LocalCtx) Get(key defs.AStr) mL0.IOption[comp_spec.ICtxValue] {
 	sf.RLock()
 	defer sf.RUnlock()
 	if key == "" {
 		return mL0.NewNone[comp_spec.ICtxValue]()
 	}
-	msg:=defs.NewStr("Get(): key='%v'", key)
+	msg:=defs.Str("Get(): key='%v'", key)
 	sf.log.Debug(msg)
 	val, isOk := sf.dictVal[key]
 	if !isOk {
@@ -109,21 +109,21 @@ func (sf *LocalCtx) Get(key defs.Str) mL0.IOption[comp_spec.ICtxValue] {
 }
 
 // Del -- удаляет значение из контекста.
-func (sf *LocalCtx) Del(key defs.Str) {
+func (sf *LocalCtx) Del(key defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
-	msg:=defs.NewStr("Del(): key='%v'", key)
+	msg:=defs.Str("Del(): key='%v'", key)
 	sf.log.Debug(msg)
-	val := sf.dictVal[key]
-	delete(sf.dictVal, key)
+	val := sf.dictVal[key.Str()]
+	delete(sf.dictVal, key.Str())
 	sf.lstSort.Del(val)
 }
 
 // Set -- добавляет значение в контекст.
-func (sf *LocalCtx) Set(key defs.Str, val any, comment defs.Str) {
+func (sf *LocalCtx) Set(key defs.AStr, val any, comment defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
-	msg:=defs.NewStr("Set(): key='%v'", key)
+	msg:=defs.Str("Set(): key='%v'", key)
 	sf.log.Debug(msg)
 	_val, isOk := sf.dictVal[key]
 	if isOk {
@@ -135,7 +135,7 @@ func (sf *LocalCtx) Set(key defs.Str, val any, comment defs.Str) {
 		return
 	}
 	_val = ctx_value.NewCtxValue(key, val, comment)
-	sf.dictVal[key] = _val
+	sf.dictVal[key.Str()] = _val
 	sf.lstSort.Add(_val)
 }
 
@@ -146,6 +146,6 @@ func (sf *LocalCtx) Wait() {
 
 // Cancel -- отменяет контекст.
 func (sf *LocalCtx) Cancel() {
-	sf.log.Warn("Cancel()")
+	sf.log.Warn(defs.Str("Cancel()"))
 	sf.fnCancel()
 }

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

@@ -34,14 +34,14 @@ func (sf *tester) done() {
 // Удаляет несуществующий ключ из локального контекста.
 func (sf *tester) del() {
 	sf.t.Log("del")
-	sf.lCtx.Del("123")
-	sf.lCtx.Del("count")
+	sf.lCtx.Del(defs.Str("123"))
+	sf.lCtx.Del(defs.Str("count"))
 }
 
 // Возвращает хранимое значение.
 func (sf *tester) get() {
 	sf.t.Log("get")
-	optRes := sf.lCtx.Get("count")
+	optRes := sf.lCtx.Get(defs.Str("count"))
 	ctxVal := optRes.Hassert("get()")
 	count := ctxVal.Val().(int)
 	if count == 15 {
@@ -52,9 +52,9 @@ func (sf *tester) get() {
 // Устанавливает значение.
 func (sf *tester) set() {
 	sf.t.Log("set")
-	msg:=defs.NewStr("count")
-	sf.lCtx.Set(msg, 5, "test_val")
-	sf.lCtx.Set(msg, 15, "test_val1")
+	msg:=defs.Str("count")
+	sf.lCtx.Set(msg, 5, defs.Str("test_val"))
+	sf.lCtx.Set(msg, 15, defs.Str("test_val1"))
 }
 
 // Создание нового локального контекста.

+ 15 - 15
v4/lev1/log_buf/log_buf.go

@@ -17,15 +17,15 @@ import (
 //	Буфер для Error -- отдельный.
 type ILogBuf interface {
 	// Debug -- сообщение отладки
-	Debug(fMsg defs.Str, args ...any)
+	Debug(fMsg defs.AStr, args ...any)
 	// LogBus -- возвращает объект публикации в шину
 	// LogBus()ILogBus
 	// Info -- информационные сообщения
-	Info(fMsg defs.Str, args ...any)
+	Info(fMsg defs.AStr, args ...any)
 	// Warn -- предупреждающие сообщения
-	Warn(fMsg defs.Str, args ...any)
+	Warn(fMsg defs.AStr, args ...any)
 	// Err -- сообщения об ошибках
-	Err(fMsg defs.IStr, args ...any)
+	Err(fMsg defs.IErr, args ...any)
 	// Get -- возвращает сообщение по номеру (0..99)
 	Get(num defs.Int) log_msg.ILogMsg
 	// GetErr -- возвращает сообщение ошибки по номеру (0..99)
@@ -42,7 +42,7 @@ var (
 
 // LogBufParam -- параметры логирующего буфера.
 type LogBufParam struct {
-	Prefix_ defs.Str              // Префикс для сообщений
+	Prefix_ defs.AStr              // Префикс для сообщений
 	IsTerm_ core_spec.ISafeBool // Признак вывода в терминал
 }
 
@@ -110,12 +110,12 @@ func (sf *LogBuf) Get(num defs.Int) log_msg.ILogMsg {
 }
 
 type tMsg struct {
-	text defs.IStr
+	text defs.AStr
 	args []any
 }
 
 // Debug -- сообщение отладки.
-func (sf *LogBuf) Debug(fMsg defs.IStr, args ...any) {
+func (sf *LogBuf) Debug(fMsg defs.AStr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -123,14 +123,14 @@ func (sf *LogBuf) Debug(fMsg defs.IStr, args ...any) {
 		args: args,
 	}
 	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+defs.Str(strMsg))
+	_msg := log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+defs.AStr(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 	sf.printTerm(_msg)
 }
 
 // Info -- информационные сообщения.
-func (sf *LogBuf) Info(fMsg defs.Str, args ...any) {
+func (sf *LogBuf) Info(fMsg defs.AStr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -138,14 +138,14 @@ func (sf *LogBuf) Info(fMsg defs.Str, args ...any) {
 		args: args,
 	}
 	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.INFO, sf.Prefix_+defs.Str(strMsg))
+	_msg := log_msg.NewLogMsg(log_msg.INFO, sf.Prefix_+defs.AStr(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 	sf.printTerm(_msg)
 }
 
 // Warn -- предупреждающие сообщения.
-func (sf *LogBuf) Warn(fMsg defs.Str, args ...any) {
+func (sf *LogBuf) Warn(fMsg defs.AStr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -153,22 +153,22 @@ func (sf *LogBuf) Warn(fMsg defs.Str, args ...any) {
 		args: args,
 	}
 	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.WARN, sf.Prefix_+defs.Str(strMsg))
+	_msg := log_msg.NewLogMsg(log_msg.WARN, sf.Prefix_+defs.AStr(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 	sf.printTerm(_msg)
 }
 
 // Err -- сообщения об ошибках.
-func (sf *LogBuf) Err(fMsg defs.IStr, args ...any) {
+func (sf *LogBuf) Err(fMsg defs.IErr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
-		text: fMsg,
+		text: fMsg.Str(),
 		args: args,
 	}
 	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.ERROR, sf.Prefix_+defs.Str(strMsg))
+	_msg := log_msg.NewLogMsg(log_msg.ERROR, sf.Prefix_+defs.AStr(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.lstErr = append(sf.lstErr, _msg)
 	sf.checkLen()

+ 11 - 7
v4/lev1/log_buf/log_buf_test.go

@@ -36,9 +36,12 @@ func (sf *tester) new() {
 	if msg == nil {
 		sf.t.Fatalf("new(): msg==nil")
 	}
-	sf.log.Debug("test msg: %v", 45)
-	sf.log.Info("test msg: %v", 46)
-	sf.log.Warn("test msg: %v", 47)
+	_msg := defs.Str("test msg: %v", 45)
+	sf.log.Debug(_msg)
+	_msg = defs.Str("test msg: %v", 46)
+	sf.log.Info(_msg)
+	_msg = defs.Str("test msg: %v", 47)
+	sf.log.Warn(_msg)
 	for i := range 120 {
 		err := defs.NewErr("test err: %v", i)
 		sf.log.Err(err)
@@ -54,12 +57,13 @@ func (sf *tester) new() {
 	_ = sf.log.Size()
 
 	sf.log.IsTerm().Reset()
-	sf.log.Warn("test msg: %v", 47)
+	_msg = defs.Str("test msg: %v", 47)
+	sf.log.Warn(_msg)
 
 	sf.log.IsTerm().Set()
-	sf.log.Warn("test msg: %v", 47)
+	sf.log.Warn(_msg)
 
 	helpers.IsStageProd = true
-	sf.log.Warn("test msg: %v", 47)
-	sf.log.Debug("test msg: %v", 45)
+	sf.log.Warn(_msg)
+	sf.log.Debug(defs.Str("test msg: %v", 45))
 }

+ 1 - 1
v4/lev1/log_buf/log_msg/log_msg.go

@@ -39,7 +39,7 @@ type logMsg struct {
 }
 
 // NewLogMsg -- возвращает новое сообщение логгера.
-func NewLogMsg(level int, msg defs.Str) ILogMsg {
+func NewLogMsg(level int, msg defs.AStr) ILogMsg {
 	sf := &logMsg{
 		createdAt: etime.NewETimeAuto(),
 		msg:       quark.NewQStr(msg),

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

@@ -2,10 +2,10 @@
 package log_dict_topic
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
@@ -19,7 +19,7 @@ type LogDictTopic struct {
 // NewLogDictTopic -- возвращает новый словарь топиков для логирования.
 func NewLogDictTopic(clientBus bus_spec.IBusClient) mL0.IResult[*LogDictTopic] {
 	if clientBus == nil {
-		err := fmt.Errorf("NewLogDictTopic(): clientBus == nil")
+		err := defs.NewErr("NewLogDictTopic(): clientBus == nil")
 		return mL0.NewErr[*LogDictTopic](err)
 	}
 	sf := &LogDictTopic{

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

@@ -110,7 +110,7 @@ func (sf *LstSort) Swap(ind1, ind2 int) {
 
 // Less -- НЕ ИСПОЛЬЗОВАТЬ сравнивает элементы по индексам.
 func (sf *LstSort) Less(ind1, ind2 int) bool {
-	return sf.lstVal[ind1].Key() < sf.lstVal[ind2].Key()
+	return sf.lstVal[ind1].Key().Str() < sf.lstVal[ind2].Key().Str()
 }
 
 // Len -- НЕ ИСПОЛЬЗОВАТЬ возвращает длину списка.

+ 9 - 8
v4/lev1/lst_sort/lst_sort_test.go

@@ -3,6 +3,7 @@ package lst_sort
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value"
 )
 
@@ -25,7 +26,7 @@ func TestLstSort(t *testing.T) {
 // Нет такого элемента.
 func (sf *tester) del3() {
 	sf.t.Log("del3")
-	val5 := ctx_value.NewCtxValue("val5", 5, "test 5")
+	val5 := ctx_value.NewCtxValue(defs.Str("val5"), 5, defs.Str("test 5"))
 	sf.lst.Del(val5)
 	sf.lst.Del(nil)
 }
@@ -39,7 +40,7 @@ func (sf *tester) del2() {
 		sf.t.Fatalf("del2(): len(%v)!=4", _len)
 	}
 	val4 := sf.lst.Get(3)
-	if val4.Key() != "val4" {
+	if val4.Key().Str() != "val4" {
 		sf.t.Fatalf("del2(): key(%v)!='val4'", val4.Key())
 	}
 	sf.lst.Add(val3)
@@ -59,7 +60,7 @@ func (sf *tester) del() {
 		sf.t.Fatalf("del(): len(%v)!=4", _len)
 	}
 	val3 := sf.lst.Get(3)
-	if val3.Key() != "val3" {
+	if val3.Key().Str() != "val3" {
 		sf.t.Fatalf("del(): key(%v)!='val3'", val3.Key())
 	}
 	sf.lst.Add(val4)
@@ -72,11 +73,11 @@ func (sf *tester) del() {
 // Добавление элементов в список.
 func (sf *tester) add() {
 	sf.t.Log("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")
+	val0 := ctx_value.NewCtxValue(defs.Str("val0"), 0, defs.Str("test 0"))
+	val1 := ctx_value.NewCtxValue(defs.Str("val1"), 1, defs.Str("test 1"))
+	val2 := ctx_value.NewCtxValue(defs.Str("val2"), 2, defs.Str("test 2"))
+	val3 := ctx_value.NewCtxValue(defs.Str("val3"), 3, defs.Str("test 3"))
+	val4 := ctx_value.NewCtxValue(defs.Str("val4"), 4, defs.Str("test 4"))
 	sf.lst.Add(val1)
 	sf.lst.Add(val4)
 	sf.lst.Add(val0)

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

@@ -2,7 +2,6 @@
 package safe_bool
 
 import (
-	"fmt"
 	"os"
 	"strings"
 	"sync"
@@ -28,22 +27,22 @@ func NewSafeBool(val bool) core_spec.ISafeBool {
 }
 
 // NewSafeBoolFromStr -- возвращает новое потокобезопасное булево из строки.
-func NewSafeBoolFromStr(strVal defs.Str) mL0.IResult[core_spec.ISafeBool] {
+func NewSafeBoolFromStr(strVal defs.AStr) mL0.IResult[core_spec.ISafeBool] {
 	sf := NewSafeBool(false)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
+		err := defs.NewErr("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
 		return mL0.NewErr[core_spec.ISafeBool](err)
 	}
 	return mL0.NewOk(sf)
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeBoolGetenv(env defs.Str) mL0.IResult[core_spec.ISafeBool] {
+func NewSafeBoolGetenv(env defs.AStr) core_spec.IResult[core_spec.ISafeBool] {
 	sf := NewSafeBool(false)
 	res := sf.Getenv(env)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
+		err := defs.NewErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
 		return mL0.NewErr[core_spec.ISafeBool](err)
 	}
 	return mL0.NewOk(sf)
@@ -71,7 +70,7 @@ func (sf *safeBool) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeBool) FromStr(strVal defs.Str) mL0.IResult[core_spec.EBool] {
+func (sf *safeBool) FromStr(strVal defs.AStr) core_spec.IResult[core_spec.EBool] {
 	_strVal := strings.ToLower(strVal.String())
 	sf.Lock()
 	defer sf.Unlock()
@@ -81,17 +80,18 @@ func (sf *safeBool) FromStr(strVal defs.Str) mL0.IResult[core_spec.EBool] {
 	case "false":
 		sf.val = false
 	default:
-		return mL0.NewErr[core_spec.EBool](fmt.Errorf("safeBool.FromStr(): val(%v) bad", strVal))
+		err:=defs.NewErr("safeBool.FromStr(): val(%v) bad", strVal)
+		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(sf.val))
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBool) Getenv(env defs.Str) mL0.IResult[core_spec.EBool] {
+func (sf *safeBool) Getenv(env defs.AStr) mL0.IResult[core_spec.EBool] {
 	strVal := os.Getenv(env.String())
-	res := sf.FromStr(defs.Str(strVal))
+	res := sf.FromStr(defs.AStr(strVal))
 	if res.IsErr() {
-		err := fmt.Errorf("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Err())
+		err := defs.NewErr("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Err())
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return res

+ 18 - 16
v4/lev1/safe_bool_react/safe_bool_react.go

@@ -2,7 +2,6 @@
 package safe_bool_react
 
 import (
-	"fmt"
 	"os"
 	"strings"
 	"sync"
@@ -16,57 +15,59 @@ import (
 // safeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
 type safeBoolReact struct {
 	sync.RWMutex
-	dict map[defs.Str]func(core_spec.EBoolMut) // Словарь обратных вызовов
+	dict map[defs.AStr]func(core_spec.EBoolMut) // Словарь обратных вызовов
 	val  bool
 }
 
 // NewSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение.
 func NewSafeBoolReact() core_spec.ISafeBoolReact {
 	sf := &safeBoolReact{
-		dict: map[defs.Str]func(core_spec.EBoolMut){},
+		dict: map[defs.AStr]func(core_spec.EBoolMut){},
 	}
 	return sf
 }
 
 // NewSafeBoolReactFromStr -- возвращает новое потокобезопасное булево с реакцией из строки.
-func NewSafeBoolReactFromStr(strVal defs.Str) mL0.IResult[core_spec.ISafeBoolReact] {
+func NewSafeBoolReactFromStr(strVal defs.AStr) mL0.IResult[core_spec.ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
+		err := defs.NewErr("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
 		return mL0.NewErr[core_spec.ISafeBoolReact](err)
 	}
 	return mL0.NewOk(sf)
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое с реакцией из окружения.
-func NewSafeBoolGetenv(env defs.Str) mL0.IResult[core_spec.ISafeBoolReact] {
+func NewSafeBoolGetenv(env defs.AStr) mL0.IResult[core_spec.ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.Getenv(env)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
+		err := defs.NewErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
 		return mL0.NewErr[core_spec.ISafeBoolReact](err)
 	}
 	return mL0.NewOk(sf)
 }
 
 // Delete -- удаляет функцию обратного вызова из наблюдения.
-func (sf *safeBoolReact) Delete(key defs.Str) {
+func (sf *safeBoolReact) Delete(key defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
 	delete(sf.dict, key)
 }
 
 // Add -- добавляет функцию обратного вызова.
-func (sf *safeBoolReact) Add(key defs.Str, fn func(core_spec.EBoolMut)) mL0.IResult[core_spec.EBool] {
+func (sf *safeBoolReact) Add(key defs.AStr, fn func(core_spec.EBoolMut)) mL0.IResult[core_spec.EBool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if key == "" {
-		return mL0.NewErr[core_spec.EBool](fmt.Errorf("safeBoolReact.Add(): key is empty"))
+		err:=defs.NewErr("safeBoolReact.Add(): key is empty")
+		return mL0.NewErr[core_spec.EBool](err)
 	}
 	_, isOk := sf.dict[key]
 	if isOk {
-		return mL0.NewErr[core_spec.EBool](fmt.Errorf("safeBoolReact.Add(): key(%v) already exists", key))
+		err:=defs.NewErr("safeBoolReact.Add(): key(%v) already exists", key)
+		return mL0.NewErr[core_spec.EBool](err)
 	}
 	sf.dict[key] = fn
 	return mL0.NewOk(ebool.NewEBool(true))
@@ -100,7 +101,7 @@ func (sf *safeBoolReact) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeBoolReact) FromStr(strVal defs.Str) mL0.IResult[core_spec.EBool] {
+func (sf *safeBoolReact) FromStr(strVal defs.AStr) core_spec.IResult[core_spec.EBool] {
 	_strVal := strings.ToLower(strVal.String())
 	sf.Lock()
 	defer sf.Unlock()
@@ -110,17 +111,18 @@ func (sf *safeBoolReact) FromStr(strVal defs.Str) mL0.IResult[core_spec.EBool] {
 	case "false":
 		sf.val = false
 	default:
-		return mL0.NewErr[core_spec.EBool](fmt.Errorf("safeBoolReact.FromStr(): val(%v) bad", strVal))
+		err:=defs.NewErr("safeBoolReact.FromStr(): val(%v) bad", strVal)
+		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(sf.val))
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBoolReact) Getenv(env defs.Str) mL0.IResult[core_spec.EBool] {
+func (sf *safeBoolReact) Getenv(env defs.AStr) mL0.IResult[core_spec.EBool] {
 	strVal := os.Getenv(env.String())
-	res := sf.FromStr(defs.Str(strVal))
+	res := sf.FromStr(defs.AStr(strVal))
 	if res.IsErr() {
-		err := fmt.Errorf("safeBoolReact.Getenv(): from env %v, err=\n\t%w", env, res.Err())
+		err := defs.NewErr("safeBoolReact.Getenv(): from env %v, err=\n\t%w", env, res.Err())
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return res

+ 7 - 8
v4/lev1/safe_int/safe_int.go

@@ -2,7 +2,6 @@
 package safe_int
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -26,22 +25,22 @@ func NewSafeInt(val defs.Int) mKs.ISafeInt {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(strVal defs.Str) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntFromStr(strVal defs.AStr) mL0.IResult[mKs.ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
+		err := defs.NewErr("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
 		return mL0.NewErr[mKs.ISafeInt](err)
 	}
 	return mL0.NewOk(sf)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env defs.Str) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntGetenv(env defs.AStr) mL0.IResult[mKs.ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.Getenv(env)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
+		err := defs.NewErr("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
 		return mL0.NewErr[mKs.ISafeInt](err)
 	}
 	return mL0.NewOk(sf)
@@ -94,7 +93,7 @@ func (sf *safeInt) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeInt) FromStr(strVal defs.Str) mL0.IResult[defs.Int] {
+func (sf *safeInt) FromStr(strVal defs.AStr) mL0.IResult[defs.Int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromStr(strVal)
@@ -122,14 +121,14 @@ func (sf *safeInt) ToBool() bool {
 }
 
 // ToStr -- конвертирует число в строку.
-func (sf *safeInt) ToStr() defs.Str {
+func (sf *safeInt) ToStr() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val.ToStr()
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeInt) Getenv(env defs.Str) mL0.IResult[defs.Int] {
+func (sf *safeInt) Getenv(env defs.AStr) mL0.IResult[defs.Int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.Getenv(env)

+ 10 - 11
v4/lev1/safe_string/safe_string.go

@@ -2,7 +2,6 @@
 package safe_string
 
 import (
-	"fmt"
 	"os"
 	"sync"
 
@@ -14,7 +13,7 @@ import (
 // safeString -- потокобезопасная строка.
 type safeString struct {
 	sync.RWMutex
-	val defs.Str
+	val defs.AStr
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку.
@@ -24,11 +23,11 @@ func NewSafeString() mKs.ISafeString {
 }
 
 // NewSafeStringGetenv -- возвращает новую потокобезопасную строку из окружения.
-func NewSafeStringGetenv(env defs.Str) mL0.IResult[mKs.ISafeString] {
+func NewSafeStringGetenv(env defs.AStr) mL0.IResult[mKs.ISafeString] {
 	sf := NewSafeString()
 	res := sf.Getenv(env)
 	if res.IsErr() {
-		err := fmt.Errorf("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
+		err := defs.NewErr("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
 		return mL0.NewErr[mKs.ISafeString](err)
 	}
 	return mL0.NewOk(sf)
@@ -38,18 +37,18 @@ func NewSafeStringGetenv(env defs.Str) mL0.IResult[mKs.ISafeString] {
 func (sf *safeString) Byte() []byte {
 	sf.RLock()
 	defer sf.RUnlock()
-	return []byte(sf.val)
+	return sf.val.Byte()
 }
 
 // Get -- возвращает хранимую строку.
-func (sf *safeString) Get() defs.Str {
+func (sf *safeString) Get() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val
 }
 
 // Set -- устанавливает строку.
-func (sf *safeString) Set(val defs.Str) {
+func (sf *safeString) Set(val defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val
@@ -63,12 +62,12 @@ func (sf *safeString) Reset() {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeString) Getenv(env defs.Str) mL0.IResult[defs.Str] {
+func (sf *safeString) Getenv(env defs.AStr) mL0.IResult[defs.AStr] {
 	strVal := os.Getenv(env.String())
 	if strVal == "" {
-		err := fmt.Errorf("safeString.Getenv(): from env(%v), val is empty", env)
-		return mL0.NewErr[defs.Str](err)
+		err := defs.NewErr("safeString.Getenv(): from env(%v), val is empty", env)
+		return mL0.NewErr[defs.AStr](err)
 	}
-	sf.val = defs.Str(strVal)
+	sf.val = defs.AStr(strVal)
 	return mL0.NewOk(sf.val)
 }

+ 1 - 2
v4/lev2/kchan/kchan.go

@@ -2,7 +2,6 @@
 package kchan
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
@@ -67,7 +66,7 @@ func (sf *KChan[T]) Read() core_spec.IResult[T] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if len(sf.lstMsg) == 0 {
-		err := fmt.Errorf("KChan[T].Read(): empty list msg")
+		err := defs.NewErr("KChan[T].Read(): empty list msg")
 		return mL0.NewErr[T](err)
 	}
 

+ 3 - 2
v4/lev2/kctx/kctx.go

@@ -5,6 +5,7 @@ import (
 	"context"
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kernel_keeper"
@@ -65,7 +66,7 @@ func (sf *kCtx) Wg() kspec.IKernelWg {
 // Done -- блокирующий вызов ожидания отмены контекста ядра.
 func (sf *kCtx) Done() {
 	<-sf.ctx.Done()
-	sf.log.Debug("kCtx.Done()")
+	sf.log.Debug(defs.Str("kCtx.Done()"))
 }
 
 // CtxBg -- возвращает неотменяемый контекст ядра (лучше не использовать).
@@ -76,5 +77,5 @@ func (sf *kCtx) CtxBg() context.Context {
 // Cancel -- отменяет контекст ядра.
 func (sf *kCtx) Cancel() {
 	sf.fnCancel()
-	sf.log.Debug("kCtx.Cancel()")
+	sf.log.Debug(defs.Str("kCtx.Cancel()"))
 }

+ 7 - 4
v4/lev2/kctx/kctx_test.go

@@ -2,6 +2,8 @@ package kctx
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
 type tester struct {
@@ -28,17 +30,18 @@ func (sf *tester) new() {
 	if ctx := kCtx.Ctx(); ctx == nil {
 		sf.t.Fatalf("new(): ctx==nil")
 	}
-	kCtx.Set("counter", 5, "test_counter")
-	if kCtx.Get("counter") == nil {
+	counter:=defs.Str("counter")
+	kCtx.Set(counter, 5, defs.Str("test_counter"))
+	if kCtx.Get(counter) == nil {
 		sf.t.Fatalf("new(): counter==nil")
 	}
-	res := kCtx.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)
 	}
-	kCtx.Del("counter")
+	kCtx.Del(counter)
 	kCtx.Cancel()
 	kCtx.Wait()
 	kCtx = GetKernelCtx()

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

@@ -8,6 +8,7 @@ import (
 	"sync"
 	"syscall"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
@@ -37,7 +38,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 	block.Lock()
 	defer block.Unlock()
 	if kernKeep != nil {
-		kernKeep.log.Debug("GetKernelKeeper()")
+		kernKeep.log.Debug(defs.Str("GetKernelKeeper()"))
 		return kernKeep
 	}
 	helpers.Hassert(ctx != nil, "NewKernelCtx(): ctx==nil", []any{})
@@ -56,7 +57,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 		log:      mL1.NewLogBuf(paramLogBuf),
 		chSys_:   make(chan os.Signal, 2),
 	}
-	sf.log.Debug("GetKernelKeeper(): first run")
+	sf.log.Debug(defs.Str("GetKernelKeeper(): first run"))
 	sf.wg.Add(qName)
 
 	go sf.run(sf.chSys_)
@@ -72,7 +73,7 @@ func (sf *kernelKeeper) Log() comp_spec.ILogBuf {
 
 // Работает в отдельном потоке и ждёт сигналов прерываний работы.
 func (sf *kernelKeeper) run(chSys chan os.Signal) {
-	sf.log.Debug("run()")
+	sf.log.Debug(defs.Str("run()"))
 
 	// Регистрируем сигналы SIGINT (Ctrl+C) и SIGTERM (завершение процесса)
 	// syscall.SIGHUP: Сигнал, отправляемый при закрытии терминала.
@@ -80,11 +81,11 @@ func (sf *kernelKeeper) run(chSys chan os.Signal) {
 	signal.Notify(chSys, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT)
 	select {
 	case sig := <-chSys: // системный сигнал
-		sf.log.Debug("run(): system signal, sig=%v\n", sig)
+		sf.log.Debug(defs.Str("run(): system signal, sig=%v\n"), sig)
 		sf.fnCancel()
 	case <-sf.ctx.Done(): // сигнал от приложения
-		sf.log.Debug("run(): cancel app context, err=\n\t%v\n", sf.ctx.Err())
+		sf.log.Debug(defs.Str("run(): cancel app context, err=\n\t%v\n"), sf.ctx.Err())
 	}
 	sf.wg.Done(qName)
-	sf.log.Debug("run(): end")
+	sf.log.Debug(defs.Str("run(): end"))
 }

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

@@ -82,7 +82,7 @@ func (sf *kModule) IsWork() core_spec.EBool {
 }
 
 // Live -- возвращает индикатор жизни модуля.
-func (sf *kModule) Live() defs.Str {
+func (sf *kModule) Live() defs.AStr {
 	return sf.strLive.Get()
 }
 

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

@@ -7,7 +7,7 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
 )
 
@@ -81,7 +81,7 @@ func (sf *tester) new() {
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	modName := module_name.IModuleNameFix(module_name.NewModuleName("test_module"))
+	modName := mod_ent.NewModuleNameFix("test_module")
 	sf.mod = NewKernelModule(modName)
 	if name := sf.mod.Name(); name.Get() != "test_module" {
 		sf.t.Fatalf("newGood1(): name(%v)!='test_module'", name)

+ 2 - 2
v4/lev2/kmodule/mod_stat/mod_stat_test.go

@@ -4,7 +4,7 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 )
 
 type tester struct {
@@ -34,7 +34,7 @@ func (sf *tester) new() {
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	modName := module_name.IModuleNameFix(module_name.NewModuleName("test"))
+	modName := mod_ent.NewModuleNameFix("test")
 	sf.stat = NewModStat(modName)
 	// Обязательно установить время сразу, для покрытия тестами
 	sf.stat.timeMinute.Set(1)

+ 12 - 10
v4/lev2/kmonolit/kmonolit.go

@@ -2,10 +2,10 @@
 package kmonolit
 
 import (
-	"fmt"
 	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
@@ -42,7 +42,8 @@ func GetMonolit(name mod_ent.AModuleName) *kMonolit {
 	}
 	mKh.Hassert(name != "", "NewMonolit(): name is empty")
 	kCtx := kctx.GetKernelCtx()
-	opt := kCtx.Get("isLocal")
+	strIsLocal:=defs.Str("isLocal")
+	opt := kCtx.Get(strIsLocal)
 	opt.Hassert("GetMonolit(): in get from kernCtx isLocal -- not found")
 	isLocalCtx := opt.Some()
 	isLocal := isLocalCtx.Val().(bool)
@@ -57,8 +58,8 @@ func GetMonolit(name mod_ent.AModuleName) *kMonolit {
 		isLocal: ebool.NewEBool(isLocal),
 	}
 	sf.log = sf.lCtx.Log()
-	sf.kCtx.Set("monolitName", name, "name of monolit")
-	sf.kCtx.Set("monolit", sf, "monolit-app")
+	sf.kCtx.Set(defs.Str("monolitName"), name, defs.Str("name of monolit"))
+	sf.kCtx.Set(defs.Str("monolit"), sf, defs.Str("monolit-app"))
 	mon = sf
 	_ = mod_spec.IKernelMonolit(sf)
 	return sf
@@ -87,14 +88,15 @@ func (sf *kMonolit) Add(module mod_spec.IKernelModule) {
 	_, isOk := sf.dict[module.Name().Get()]
 	mKh.Hassert(!isOk, "kMonolit.Add(): module(%v) already exists", []any{module.Name()})
 	sf.dict[module.Name().Get()] = module
-	sf.log.Debug("kMonolit.Add(): module='%v'", module.Name())
+	sf.log.Debug(defs.Str("kMonolit.Add(): module='%v'", module.Name()))
 	if sf.isWork.Get() {
 		go module.Run()
-		sf.log.Debug("kMonolit.Add(): module='%v' is run", module.Name())
+		sf.log.Debug(defs.Str("kMonolit.Add(): module='%v' is run", module.Name()))
 	}
-	key := fmt.Sprintf("module_%v", len(sf.dict))
+	key := defs.Str("module_%v", len(sf.dict))
 	moduleName := module.Name()
-	sf.lCtx.Set(key, module, "kMonolit.Add(): module="+moduleName.String())
+	comment:=defs.Str("kMonolit.Add(): module="+moduleName.Str())
+	sf.lCtx.Set(key, module, comment)
 }
 
 // Run -- запускает монолит в работу.
@@ -111,7 +113,7 @@ func (sf *kMonolit) Run() {
 	for _, module := range sf.dict {
 		go module.Run()
 	}
-	sf.log.Debug("kMonolit.Run()")
+	sf.log.Debug(defs.Str("kMonolit.Run()"))
 }
 
 // IsLocal -- возвращает признак локальной шины.
@@ -133,5 +135,5 @@ func (sf *kMonolit) Wait() {
 	defer sf.kCtx.Unlock()
 	sf.isWork.Reset()
 	sf.isEnd.Set()
-	sf.log.Debug("kMonolit.close(): end")
+	sf.log.Debug(defs.Str("kMonolit.close(): end"))
 }

+ 6 - 3
v4/lev2/kmonolit/kmonolit_test.go

@@ -5,9 +5,11 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
 )
@@ -74,7 +76,7 @@ func (sf *mod) Run() {}
 
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
-	modName := module_name.IModuleNameFix(module_name.NewModuleName("test_module"))
+	modName := mod_ent.NewModuleNameFix("test_module")
 	mod := newMod(modName)
 	sf.mon.Add(mod)
 }
@@ -105,11 +107,12 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
+	strIsLocal:=defs.Str("isLocal")
 	kCtx := kctx.GetKernelCtx()
-	kCtx.Set("isLocal", true, "type bus")
+	kCtx.Set(strIsLocal, true, defs.Str("type bus"))
 	for {
 		time.Sleep(time.Millisecond * 1)
-		if kCtx.Get("isLocal") != nil {
+		if kCtx.Get(strIsLocal) != nil {
 			break
 		}
 	}

+ 12 - 12
v4/lev2/kserv_http/kserv_http.go

@@ -59,7 +59,7 @@ func getParams() (string, comp_spec.ILogBuf, kspec.IKernelCtx) {
 		Prefix_: "kServHttp",
 	}
 	log := mL1.NewLogBuf(param)
-	log.Debug("GetKernelServHttp(): first run")
+	log.Debug(defs.Str("GetKernelServHttp(): first run"))
 	strLocalUrl := os.Getenv("LOCAL_HTTP_URL")
 	hassert(strLocalUrl != "", "getParams(): env LOCAL_HTTP_URL not set")
 	kCtx := kctx.GetKernelCtx()
@@ -71,12 +71,12 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 	block.Lock()
 	defer block.Unlock()
 	if kernServHttp != nil {
-		kernServHttp.log.Debug("GetKernelServHttp()")
+		kernServHttp.log.Debug(defs.Str("GetKernelServHttp()"))
 		return kernServHttp
 	}
 	strLocalUrl, log, kCtx := getParams()
 
-	optMonolit := kCtx.Get("monolitName")
+	optMonolit := kCtx.Get(defs.Str("monolitName"))
 	optMonolit.Hassert("GetKernelServHttp(): not have monolit name from kCtx")
 	strMonolit := optMonolit.Some().Val().(string)
 	confFiber := fiber.Config{
@@ -110,9 +110,9 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 		Title: fmt.Sprintf("Страница метрик %q", strMonolit),
 	}))
 	sf.kCtx.Wg().Add(streamName)
-	kCtx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
+	kCtx.Set(defs.Str("fiberApp"), sf.fiberApp, defs.Str("GetKernelServHttp() internal fiber app"))
 	kernServHttp = sf
-	kCtx.Set("kServHttp", kernServHttp, "kServHttp")
+	kCtx.Set(defs.Str("kServHttp"), kernServHttp, defs.Str("kServHttp"))
 	return kernServHttp
 }
 
@@ -142,23 +142,23 @@ func (sf *kServHttp) Run() {
 	if sf.isWork.Get() {
 		return
 	}
-	sf.log.Debug("Run(): url='%v'", sf.strUrl)
+	sf.log.Debug(defs.Str("Run(): url='%v'", sf.strUrl))
 	lstPort := strings.Split(sf.strUrl, ":")
 	strPort := lstPort[len(lstPort)-1]
 	strPort = strings.ReplaceAll(strPort, "/", "")
 	strPort = strings.ReplaceAll(strPort, `"`, "")
-	chErr := make(chan string, 2)
+	chErr := make(chan defs.IErr, 2)
 	fnListen := func() {
 		defer close(chErr)
 		err := sf.fiberApp.Listen(":" + strPort)
-		chErr <- fmt.Sprint(err)
+		chErr <- defs.NewErr("kServHttp.Run().fnListen(): in listen server on port=%q, err=\n\t%v", strPort, err)
 	}
 	go fnListen()
 	go sf.fnChErr(chErr)
 	fnCheckServer := func() error {
 		client := &http.Client{Timeout: 5 * time.Millisecond}
 		url := sf.strUrl + "monitor"
-		sf.log.Debug("url=%v", url)
+		sf.log.Debug(defs.Str("url=%v", url))
 		var (
 			resp *http.Response
 			err  error
@@ -182,11 +182,11 @@ func (sf *kServHttp) Run() {
 }
 
 // В отдельном потоке ждёт закрытия канала.
-func (sf *kServHttp) fnChErr(chErr <-chan defs.Str) {
+func (sf *kServHttp) fnChErr(chErr <-chan defs.IErr) {
 	strErr := <-chErr
 	if strErr.String() != "<nil>" {
 		err := defs.NewErr("kServHttp.fnChErr(): in listen, err=\n\t%v", strErr)
-		msg := defs.NewStr("fnChErr(): err=\n\t%v", err.Error())
+		msg := defs.Str("fnChErr(): err=\n\t%v", err.Error())
 		sf.log.Err(msg, err)
 		sf.kCtx.Cancel()
 	}
@@ -203,5 +203,5 @@ func (sf *kServHttp) close() {
 	err := sf.fiberApp.Server().Shutdown()
 	assert(err == nil, "kServHttp.close(): in close server, err=\n\t%v", err)
 	sf.kCtx.Wg().Done(streamName)
-	sf.log.Debug("close(): end")
+	sf.log.Debug(defs.Str("close(): end"))
 }

+ 3 - 3
v4/lev2/kserv_http/kserv_http_test.go

@@ -43,8 +43,8 @@ func (sf *tester) close() {
 		sf.t.Fatalf("close(): isWork==true")
 	}
 	kernServHttp.Run()
-	chErr := make(chan defs.Str, 2)
-	chErr <- "test err"
+	chErr := make(chan defs.IErr, 2)
+	chErr <- defs.NewErr("test err")
 	close(chErr)
 	kernServHttp.fnChErr(chErr)
 }
@@ -80,7 +80,7 @@ func (sf *tester) newGood1() {
 	sf.me = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", baseUrl)
-	sf.kCtx.Set("monolitName", "test_monolit", "comment")
+	sf.kCtx.Set(defs.Str("monolitName"), "test_monolit", defs.Str("comment"))
 	serv := GetKernelServHttp().(*kServHttp)
 	if serv != kernServHttp {
 		sf.t.Fatalf("newGood1(): bad IKernelServHttp")

+ 7 - 5
v4/lev2/kserv_http_std/kserv_http_std.go

@@ -42,7 +42,7 @@ func GetKservHttpStd() mL0.IResult[*kServHttpStd] {
 		Prefix_: "kServHttpStd",
 	}
 	log := mL1.NewLogBuf(logBufParam)
-	log.Debug("GetKservHttpStd()")
+	log.Debug(defs.Str("GetKservHttpStd()"))
 	resPort := mL1.NewSafeIntGetenv("SERV_HTTP_STD_PORT")
 	resPort.Hassert("in get env SERV_HTTP_STD_PORT")
 	sf := &kServHttpStd{
@@ -65,18 +65,20 @@ func (sf *kServHttpStd) Run() {
 	}
 	// Запуск сервера в горутине
 	go func() {
-		sf.log.Debug("Run().fn(): run on http://%v", sf.server.Addr)
+		msg:=defs.Str("kServHttpStd.Run().fn(): run on http://%v", sf.server.Addr)
+		sf.log.Debug(msg)
 		if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
-			err:=defs.NewErr("Run.fn(): in work, err=\n\t%v", err)
+			err:=defs.NewErr("kServHttpStd.Run.fn(): in work, err=\n\t%v", err)
 			sf.log.Err(err)
 		}
 	}()
 	go sf.close()
 	if err := sf.server.Shutdown(sf.kCtx.Ctx()); err != nil {
-		sf.log.Debug("Ошибка при graceful shutdown: %v", err)
+		err:=defs.NewErr("Ошибка при graceful shutdown: %w", err)
+		sf.log.Debug(err)
 	}
 
-	sf.log.Info("Сервер остановлен")
+	sf.log.Info(defs.Str("Сервер остановлен"))
 }
 
 func (sf *kServHttpStd) close() {

+ 9 - 6
v4/lev2/kwg/kwg.go

@@ -9,6 +9,7 @@ import (
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -38,7 +39,7 @@ func GetKernelWg(ctx context.Context) kspec.IKernelWg {
 	block.Lock()
 	defer block.Unlock()
 	if kernWg != nil {
-		kernWg.log.Debug("GetKernelWg()")
+		kernWg.log.Debug(defs.Str("GetKernelWg()"))
 		return kernWg
 	}
 	mKh.Hassert(ctx != nil, "GetKernelWg(): ctx==nil")
@@ -52,7 +53,7 @@ func GetKernelWg(ctx context.Context) kspec.IKernelWg {
 		isWork:     mL1.NewSafeBool(false),
 		log:        mL1.NewLogBuf(paramLogBuf),
 	}
-	sf.log.Debug("GetKernelWg(): run")
+	sf.log.Debug(defs.Str("GetKernelWg(): run"))
 	go sf.close()
 	sf.isWork.Set()
 	kernWg = sf
@@ -93,7 +94,8 @@ func (sf *kernelWg) Done(name *stream_name.AStreamName) {
 	sf.Lock()
 	defer sf.Unlock()
 	delete(sf.dictStream, name)
-	sf.log.Debug("Done(): stream(%v) done", name)
+	msg:=defs.Str("Done(): stream(%v) done", name)
+	sf.log.Debug(msg)
 }
 
 // Wait -- блокирующий вызов; возвращает управление, только когда все потоки завершили работу.
@@ -104,14 +106,15 @@ func (sf *kernelWg) Wait() {
 			break
 		}
 	}
-	sf.log.Debug("Wait(): done")
+	sf.log.Debug(defs.Str("Wait(): done"))
 }
 
 // Add -- добавляет поток в ожидание.
 func (sf *kernelWg) Add(name *stream_name.AStreamName) {
 	sf.Lock()
 	defer sf.Unlock()
-	sf.log.Debug("Add(): stream='%v'", name)
+	msg:=defs.Str("Add(): stream('%v') done", name)
+	sf.log.Debug(msg)
 	mKh.Hassert(sf.isWork.Get(), "Add(): stream=%v, work end", []any{name})
 	mKh.Hassert(name.Get() != "", "Add(): name stream is empty")
 	_, isOk := sf.dictStream[name]
@@ -139,5 +142,5 @@ func (sf *kernelWg) close() {
 		return
 	}
 	sf.isWork.Reset()
-	sf.log.Debug("close(): end")
+	sf.log.Debug(defs.Str("close(): end"))
 }

+ 4 - 2
v4/lev2/lsi/kstore_kv/kstore_kv_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -53,11 +54,12 @@ func (sf *tester) workBad1() {
 	if res.IsOk() {
 		sf.t.Fatalf("workBad1(): set, err==nil")
 	}
-	opt := kernStore.Get("test_key")
+	strKey:=store_ent.NewStoreKeyFix("test_key")
+	opt := kernStore.Get(strKey)
 	if opt.IsOk() {
 		sf.t.Fatalf("workBad1(): get, val==nil")
 	}
-	res = kernStore.Delete("test_key")
+	res = kernStore.Delete(strKey)
 	if res.IsOk() {
 		sf.t.Fatalf("workBad1(): del, err==nil")
 	}

+ 1 - 4
v4/lev2/lsi/store_ent/store_ent.go

@@ -6,16 +6,13 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
-// AStoreKey -- ключ хранилища.
-type AStoreKey = store_key.AStoreKey
-
 // IStoreKeyFix -- интерфейс ключа хранилища.
 type IStoreKeyFix = store_key.IStoreKeyFix
 
 // NewStoreKey -- создать новый ключ хранилища.
 //
 //go:fix inline
-func NewStoreKeyFix(val AStoreKey) IStoreKeyFix {
+func NewStoreKeyFix(val store_key.AStoreKey) IStoreKeyFix {
 	return store_key.NewStoreKey(val)
 }
 

+ 2 - 2
v4/lev2/lsi/store_spec/ibucket_base.go

@@ -18,9 +18,9 @@ type IBucketBase interface {
 	// SizeLimit -- лимит размера бакета
 	SizeLimit() int64
 	// CreatedAt -- время создания бакета
-	CreatedAt() defs.Str
+	CreatedAt() defs.AStr
 	// UpdatedAt -- время обновления бакета
-	UpdatedAt() defs.Str
+	UpdatedAt() defs.AStr
 	// Vers -- версия бакета
 	Vers() defs.Int
 	// DictRec -- словарь для хранения данных

+ 4 - 4
v4/lev2/lsi/store_spec/ikernel_store_kv.go

@@ -9,13 +9,13 @@ import (
 // IKernelStoreKv -- интерфейс к локальному быстрому key-value хранилищу ядра.
 type IKernelStoreKv interface {
 	// Get -- возвращает значение по ключу
-	Get(key defs.Str) core_spec.IResult[[]byte]
+	Get(key defs.AStr) core_spec.IResult[[]byte]
 	// ByPrefix -- возвращает список ключей по префиксу
-	ByPrefix(prefix defs.Str) core_spec.IResult[[]defs.Str]
+	ByPrefix(prefix defs.AStr) core_spec.IResult[[]defs.AStr]
 	// Set -- устанавливает значение по ключу
-	Set(key defs.Str, val []byte) core_spec.IResult[core_spec.EBool]
+	Set(key defs.AStr, val []byte) core_spec.IResult[core_spec.EBool]
 	// Delete -- удаляет значение по ключу
-	Delete(key defs.Str) core_spec.IResult[core_spec.EBool]
+	Delete(key defs.AStr) core_spec.IResult[core_spec.EBool]
 	// Log -- возвращает локальный лог
 	Log() comp_spec.ILogBuf
 }

+ 5 - 9
v4/lev2/lti/bus_ent/handler_name/handler_name.go

@@ -2,6 +2,7 @@
 package handler_name
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
@@ -10,6 +11,7 @@ type AHandlerName string
 
 // IHandlerNameFix -- неизменяемое имя функции обработчика.
 type IHandlerNameFix interface {
+	defs.IStr
 	// String -- строковое представление имени функции обработчика.
 	String() string
 	// Get -- возвращает имя функции обработчика.
@@ -18,27 +20,21 @@ type IHandlerNameFix interface {
 
 // HandlerName -- имя функции обработчика.
 type HandlerName struct {
-	val AHandlerName
+	defs.AStr
 }
 
 // NewHandlerName -- создать новое имя функции обработчика.
 func NewHandlerName(val AHandlerName) *HandlerName {
 	helpers.Assert(val != "", "NewAHandlerName: val is empty")
 	sf := &HandlerName{
-		val: val,
+		AStr: defs.AStr(val),
 	}
 	_ = IHandlerNameFix(sf)
 	return sf
 }
 
-// String -- строковое представление.
-//
-//go:fix inline
-func (sf *HandlerName) String() string {
-	return string(sf.val)
-}
 
 // Get -- получить значение.
 func (sf *HandlerName) Get() AHandlerName {
-	return sf.val
+	return AHandlerName(sf.AStr)
 }

+ 1 - 2
v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go

@@ -10,7 +10,6 @@ import (
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/handler_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
 
@@ -29,7 +28,7 @@ func NewMockHandlerServe(topic bus_ent.ITopicFix, name string) *MockHandlerServe
 	mKh.Hassert(name != "", "NewMockHandlerServe(): name is empty")
 	sf := &MockHandlerServe{
 		Topic_: topic,
-		Name_:  bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(name))),
+		Name_:  bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(name)),
 		IsBad_: safe_bool.NewSafeBool(false),
 	}
 	_ = bus_spec.IBusHandlerServe(sf)

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go

@@ -7,6 +7,7 @@ import (
 
 	"github.com/gofiber/fiber/v3"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
@@ -45,7 +46,7 @@ func TestHandlerHttpSub(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.ctx.Set("monolitName", "test_monolit", "comment")
+	sf.ctx.Set(defs.Str("monolitName"), "test_monolit", "comment")
 	sf.new()
 	sf.back()
 	sf.ctx.Cancel()

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go

@@ -22,9 +22,10 @@ type MockHandlerSub struct {
 func NewMockHandlerSub(topic bus_ent.ITopicFix, localHook string) *MockHandlerSub {
 	mKh.Hassert(topic != nil, "NewMockHandlerSub(): topic is nil")
 	mKh.Hassert(localHook != "", "NewMockHandlerSub(): name is empty")
+	handlerName:=bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(localHook + "_" + rand.Text()))
 	sf := &MockHandlerSub{
 		Topic_: topic,
-		Name_:  bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(localHook + "_" + rand.Text()))),
+		Name_:  handlerName,
 	}
 	_ = bus_spec.IBusHandlerSubscribe(sf)
 	return sf

+ 4 - 3
v4/lev2/lti/dot/msg_serve/msg_serve.go

@@ -2,6 +2,7 @@
 package msg_serve
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -9,7 +10,7 @@ import (
 // ServeReq -- входящий запрос на обслуживание.
 type ServeReq struct {
 	Topic_  bus_ent.ATopic `json:"topic"`
-	Uuid_   string         `json:"uuid"`
+	Uuid_   defs.AStr         `json:"uuid"`
 	BinReq_ []byte         `json:"req"`
 }
 
@@ -21,8 +22,8 @@ func (sf *ServeReq) SelfCheck() {
 
 // ServeResp -- ответ на входящий запрос.
 type ServeResp struct {
-	Status_  string `json:"status"`
-	Uuid_    string `json:"uuid"`
+	Status_  defs.AStr `json:"status"`
+	Uuid_    defs.AStr `json:"uuid"`
 	BinResp_ []byte `json:"resp"`
 }
 

+ 4 - 3
v4/lev2/lti/dot/msg_unsub/msg_unsub.go

@@ -2,6 +2,7 @@
 package msg_unsub
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -9,7 +10,7 @@ import (
 // UnsubReq -- запрос на отписку от топика.
 type UnsubReq struct {
 	HandlerName_ bus_ent.AHandlerName `json:"name"` // Уникальная метка подписки
-	Uuid_        string               `json:"uuid"`
+	Uuid_        defs.AStr            `json:"uuid"`
 }
 
 // SelfCheck -- проверка запроса на правильность полей.
@@ -20,8 +21,8 @@ func (sf *UnsubReq) SelfCheck() {
 
 // UnsubResp -- ответ на запрос отписки.
 type UnsubResp struct {
-	Status_ string `json:"status"`
-	Uuid_   string `json:"uuid"`
+	Status_ defs.AStr `json:"status"`
+	Uuid_   defs.AStr `json:"uuid"`
 }
 
 // SelfCheck -- проверяет правильность своих полей.

+ 7 - 5
v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook.go

@@ -4,6 +4,7 @@ package dict_sub_hook
 import (
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -32,12 +33,13 @@ func (sf *dictSubHook) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if handler == nil {
-		sf.kCtx.Log().Err("dictSubHook.Unsubscribe(): handler==nil")
+		err:=defs.NewErr("dictSubHook.Unsubscribe(): handler==nil")
+		sf.kCtx.Log().Err(err)
 		return
 	}
 	handlerName := handler.Name()
 	delete(sf.dict, handlerName.Get())
-	sf.kCtx.Del(handlerName.String())
+	sf.kCtx.Del(handlerName.Str())
 }
 
 // Subscribe -- добавляет в словарь подписки новый обработчик.
@@ -47,7 +49,7 @@ func (sf *dictSubHook) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
 	helpers.Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil", []any{})
 	handlerName := handler.Name()
 	sf.dict[handlerName.Get()] = struct{}{}
-	sf.kCtx.Set(handlerName.String(), handler, "subscribe handler")
+	sf.kCtx.Set(handlerName.Str(), handler, "subscribe handler")
 }
 
 // Read -- вызывает все обработчики словаря подписок.
@@ -55,9 +57,9 @@ func (sf *dictSubHook) Read(binMsg []byte) {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	for handlerName := range sf.dict {
-		optHand := sf.kCtx.Get(string(handlerName))
+		optHand := sf.kCtx.Get(defs.AStr(handlerName))
 		if optHand.IsNone() {
-			sf.kCtx.Del(string(handlerName))
+			sf.kCtx.Del(defs.AStr(handlerName))
 			continue
 		}
 		handler := optHand.Some().Val().(bus_spec.IBusHandlerSubscribe)

+ 7 - 6
v4/lev2/lti/kbus/dict_topic_serve/dict_topic_serve.go

@@ -3,12 +3,12 @@ package dict_topic_serve
 
 import (
 	"context"
-	"fmt"
 	"sync"
 	"time"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -39,13 +39,13 @@ func (sf *dictServe) Register(handler bus_spec.IBusHandlerServe) mL0.IResult[cor
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
-		err := fmt.Errorf("dictServe.Register(): IBusHandlerSubscribe==nil")
+		err := defs.NewErr("dictServe.Register(): IBusHandlerSubscribe==nil")
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	topic := handler.Topic()
 	isTwinRegister := sf.register(handler)
 	if isTwinRegister {
-		err := fmt.Errorf("dictServe.Register(): handler of topic (%v) already register", topic.Get())
+		err := defs.NewErr("dictServe.Register(): handler of topic (%v) already register", topic.Get())
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(true))
@@ -56,7 +56,8 @@ func (sf *dictServe) Unregister(handler bus_spec.IBusHandlerServe) {
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
-		sf.kCtx.Log().Err("dictServe.Unregister(): IBusHandlerSubscribe==nil")
+		err:= defs.NewErr("dictServe.Unregister(): IBusHandlerSubscribe==nil")
+		sf.kCtx.Log().Err(err)
 		return
 	}
 	delete(sf.dictServe, handler.Topic().Get())
@@ -68,7 +69,7 @@ func (sf *dictServe) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IRe
 	defer sf.RUnlock()
 	handler, isOk := sf.dictServe[topic.Get()]
 	if !isOk {
-		err := fmt.Errorf("dictServe.SendRequest(): handler for topic (%v) not exists", topic.Get())
+		err := defs.NewErr("dictServe.SendRequest(): handler for topic (%v) not exists", topic.Get())
 		return mL0.NewErr[[]byte](err)
 	}
 	var (
@@ -84,7 +85,7 @@ func (sf *dictServe) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IRe
 	go fnCall()
 	select {
 	case <-ctx.Done():
-		err := fmt.Errorf("dictServe.SendRequest(): in call for topic (%v), err=\n\t%w", topic.Get(), ctx.Err())
+		err := defs.NewErr("dictServe.SendRequest(): in call for topic (%v), err=\n\t%w", topic.Get(), ctx.Err())
 		return mL0.NewErr[[]byte](err)
 	case res := <-chRes:
 		return res

+ 11 - 10
v4/lev2/lti/kbus_base/kbus_base.go

@@ -2,11 +2,11 @@
 package kbus_base
 
 import (
-	"fmt"
 	"sync"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -95,14 +95,14 @@ func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) core_spec.I
 func (sf *KBusBase) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IResult[[]byte] {
 	sf.log.Debug("KBusBase.SendRequest(): topic='%v'", topic.Get())
 	if !sf.IsWork_.Get() {
-		err := fmt.Errorf("KBusBase.SendRequest():  topic='%v', bus already closed", topic.Get())
-		sf.log.Err(err.Error())
+		err := defs.NewErr("KBusBase.SendRequest():  topic='%v', bus already closed", topic.Get())
+		sf.log.Err(err)
 		return mL0.NewErr[[]byte](err)
 	}
 	res := sf.dictServe.SendRequest(topic, binReq)
 	if res.IsErr() {
-		err := fmt.Errorf("KBusBase.SendRequest(): topic='%v', err=\n\t%w", topic.Get(), res.Err())
-		sf.log.Err(err.Error())
+		err := defs.NewErr("KBusBase.SendRequest(): topic='%v', err=\n\t%w", topic.Get(), res.Err())
+		sf.log.Err(err)
 		return mL0.NewErr[[]byte](err)
 	}
 	return res
@@ -111,13 +111,14 @@ func (sf *KBusBase) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IRes
 // RegisterServe -- регистрирует обработчики входящих запросов.
 func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult[core_spec.EBool] {
 	if handler == nil {
-		return mL0.NewErr[core_spec.EBool](fmt.Errorf("KBusBase.RegisterServe(): IBusHandlerServe==nil"))
+		err:=defs.NewErr("KBusBase.RegisterServe(): IBusHandlerServe==nil")
+		return mL0.NewErr[core_spec.EBool](err)
 	}
 	sf.log.Debug("KBusBase.RegisterServe(): handler='%v'", handler.Name())
 	res := sf.dictServe.Register(handler)
 	if res.IsErr() {
-		err := fmt.Errorf("KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
-		sf.log.Err(err.Error())
+		err := defs.NewErr("KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
+		sf.log.Err(err)
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(true))
@@ -127,8 +128,8 @@ func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult
 func (sf *KBusBase) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IResult[core_spec.EBool] {
 	sf.log.Debug("KBusBase.Publish(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
-		err := fmt.Errorf("KBusBase.Publish(): topic='%v',bus already closed", topic)
-		sf.log.Err(err.Error())
+		err := defs.NewErr("KBusBase.Publish(): topic='%v',bus already closed", topic)
+		sf.log.Err(err)
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	// Асинхронный запуск чтения

+ 27 - 23
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -3,7 +3,6 @@ package client_bus_http
 
 import (
 	"encoding/json"
-	"fmt"
 	"io"
 	"net/http"
 	"strings"
@@ -12,6 +11,7 @@ import (
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
@@ -68,7 +68,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 
 	req := &dot.UnsubReq{
 		HandlerName_: handler.Name().Get(),
-		Uuid_:        _uuid.String(),
+		Uuid_:        defs.Str(defs.AStr(_uuid.String())),
 	}
 	req.SelfCheck()
 	binReq, err := json.MarshalIndent(req, "", "  ")
@@ -86,14 +86,17 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	resp := &dot.UnsubResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		sf.log.Err("Unsubscribe(): in unmarshal response, err=\n\t%v", err)
+		err:=defs.NewErr("Unsubscribe(): in unmarshal response, err=\n\t%v", err)
+		sf.log.Err(err)
 		return
 	}
 	if resp.Status_ != "ok" {
-		sf.log.Err("Unsubscribe(): resp!='ok', err=\n\t%v", resp.Status_)
+		err:=defs.NewErr("Unsubscribe(): resp!='ok', err=\n\t%v", resp.Status_)
+		sf.log.Err(err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		sf.log.Err("Unsubscribe(): resp uuid(%v) bad", resp.Uuid_)
+		err := defs.NewErr("Unsubscribe(): resp uuid(%v) bad", resp.Uuid_)
+		sf.log.Err(err)
 	}
 }
 
@@ -115,21 +118,21 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IR
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
-		err := fmt.Errorf("ClientBusHttp.Subscribe(): in make POST-request, err=\n\t%w", err)
+		err := defs.NewErr("ClientBusHttp.Subscribe(): in make POST-request, err=\n\t%w", err)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	resp := &dot.SubscribeResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := fmt.Errorf("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
+		err := defs.NewErr("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	if resp.Status_ != "ok" {
-		err := fmt.Errorf("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := defs.NewErr("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := fmt.Errorf("ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
+		err := defs.NewErr("ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	res := sf.bus.Subscribe(handler)
@@ -142,7 +145,7 @@ func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
 	req := &dot.ServeReq{
 		Topic_:  topic.Get(),
-		Uuid_:   _uuid.String(),
+		Uuid_:   defs.AStr(_uuid.String()),
 		BinReq_: binReq,
 	}
 	req.SelfCheck()
@@ -154,21 +157,21 @@ func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
-		err := fmt.Errorf("ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
+		err := defs.NewErr("ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
 		return mL0.WrapErr(resBody, err)
 	}
 	resp := &dot.ServeResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := fmt.Errorf("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
+		err := defs.NewErr("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[[]byte](err)
 	}
 	if resp.Status_ != "ok" {
-		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := defs.NewErr("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
 		return mL0.NewErr[[]byte](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
+		err := defs.NewErr("ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
 		return mL0.NewErr[[]byte](err)
 	}
 	return mL0.NewOk(resp.BinResp_)
@@ -177,11 +180,12 @@ func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0
 // RegisterServe -- регистрирует в локальной шине обработчик.
 func (sf *ClientBusHttp) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult[mKs.EBool] {
 	if handler == nil {
-		return mL0.NewErr[mKs.EBool](fmt.Errorf("ClientBusHttp.RegisterServe(): handler==nil"))
+		err:=defs.NewErr("ClientBusHttp.RegisterServe(): handler==nil")
+		return mL0.NewErr[mKs.EBool](err)
 	}
 	res := sf.bus.RegisterServe(handler)
 	if res.IsErr() {
-		err := fmt.Errorf("ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
+		err := defs.NewErr("ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(true))
@@ -205,21 +209,21 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
-		err := fmt.Errorf("ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
+		err := defs.NewErr("ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	resp := &dot.PublishResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := fmt.Errorf("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
+		err := defs.NewErr("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	if resp.Status_ != "ok" {
-		err := fmt.Errorf("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := defs.NewErr("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := fmt.Errorf("ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
+		err := defs.NewErr("ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
 		return mL0.NewErr[mKs.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(true))
@@ -230,21 +234,21 @@ func (sf *ClientBusHttp) makePost(hReq *http.Request) mKs.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)
+		err := defs.NewErr("ClientBusHttp.makePost(): after request, err=\n\t%w", err)
 		return mL0.NewErr[[]byte](err)
 	}
 	defer func() {
 		_ = _resp.Body.Close()
 	}()
 	if _resp.StatusCode != http.StatusOK {
-		err := fmt.Errorf("ClientBusHttp.makePost(): url=%q, status=%q",
+		err := defs.NewErr("ClientBusHttp.makePost(): url=%q, status=%q",
 			hReq.URL, _resp.Status)
 		return mL0.NewErr[[]byte](err)
 	}
 
 	binBody, err := io.ReadAll(_resp.Body)
 	if err != nil {
-		err := fmt.Errorf("ClientBusHttp.makePost(): after read body, err=\n\t%v",
+		err := defs.NewErr("ClientBusHttp.makePost(): after read body, err=\n\t%v",
 			err)
 		return mL0.NewErr[[]byte](err)
 	}

+ 15 - 10
v4/lev2/lti/kbus_http/kbus_http.go

@@ -8,6 +8,7 @@ import (
 
 	"github.com/gofiber/fiber/v3"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
@@ -78,7 +79,8 @@ func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		sf.log.Err("postSub(): in body parser, status=%q", resp.Status_)
+		err:=defs.NewErr("kBusHttp.postSub(): in body parser, status=%q", resp.Status_)
+		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
 	resp := sf.processSubscribe(req)
@@ -119,7 +121,8 @@ func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		sf.log.Err("postPublish(): in body parser, status=%v", resp.Status_)
+		err:=defs.NewErr("postPublish(): in body parser, status=%v", resp.Status_)
+		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
 	resp := sf.processPublish(req)
@@ -153,12 +156,13 @@ func (sf *kBusHttp) postSendRequest(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.ServeResp{
-			Status_: fmt.Sprintf("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
+			Status_: defs.Str("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		sf.log.Err("postSendRequest(): in body parser, status=%v", resp.Status_)
+		err:=defs.NewErr("kBusHttp.postSendRequest(): in body parser, status=%v", resp.Status_)
+		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
 	resp := sf.processSendRequest(req)
@@ -176,7 +180,7 @@ func (sf *kBusHttp) processSendRequest(req *dot.ServeReq) *dot.ServeResp {
 		Uuid_:   req.Uuid_,
 	}
 	if res.IsErr() {
-		resp.Status_ = fmt.Sprintf("kernelBusHttp.processSendRequest(): err=\n\t%v", res.Err())
+		resp.Status_ = defs.Str("kernelBusHttp.processSendRequest(): err=\n\t%v", res.Err())
 		return resp
 	}
 	resp.BinResp_ = res.Ok()
@@ -193,12 +197,13 @@ func (sf *kBusHttp) postUnsub(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.ServeResp{
-			Status_: fmt.Sprintf("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
+			Status_: defs.Str("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		sf.log.Err("postUnsub(): in body_parser, status=%q", resp.Status_)
+		err:=defs.NewErr("kBusHttp.postUnsub(): in body parser, status=%q", resp.Status_)
+		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
 	resp := sf.processUnsubRequest(req)
@@ -213,14 +218,14 @@ func (sf *kBusHttp) processUnsubRequest(req *dot.UnsubReq) *dot.UnsubResp {
 		Status_: "ok",
 		Uuid_:   req.Uuid_,
 	}
-	optHandler := sf.KCtx_.Get(string(req.HandlerName_))
+	optHandler := sf.KCtx_.Get(defs.AStr(req.HandlerName_))
 	if optHandler.IsNone() {
-		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
+		resp.Status_ = defs.Str("kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
 			req.HandlerName_)
 		return resp
 	}
 	if optHandler == nil {
-		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): handler(%v) not exists", req.HandlerName_)
+		resp.Status_ = defs.Str("kernelBusHttp.processUnsubRequest(): handler(%v) not exists", req.HandlerName_)
 		return resp
 	}
 	hand := optHandler.Some().Val().(bus_spec.IBusHandlerSubscribe)

+ 3 - 2
v4/lev2/wui/hx_url/hx_url.go

@@ -2,6 +2,7 @@
 package hx_url
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/hx_url_method"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/hx_url_patch"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
@@ -14,7 +15,7 @@ type HxUrl struct {
 }
 
 // NewHxUrl -- возвращает новый URL запроса.
-func NewHxUrl(patch string) *HxUrl {
+func NewHxUrl(patch defs.AStr) *HxUrl {
 	sf := &HxUrl{
 		method: hx_url_method.NewHxUrlMethod(),
 		patch:  hx_url_patch.NewHxUrlPatch(patch),
@@ -25,7 +26,7 @@ func NewHxUrl(patch string) *HxUrl {
 
 // String -- возвращает строковое представление тэга.
 func (sf *HxUrl) String() string {
-	return sf.method.Get() + `="` + sf.patch.Get() + `"`
+	return string(sf.method.Get() + `="` + sf.patch.Get() + `"`)
 }
 
 // Method -- возвращает метод запроса.

+ 5 - 4
v4/lev2/wui/hx_url_method/hx_url_method.go

@@ -4,13 +4,14 @@ package hx_url_method
 import (
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
 )
 
-// HxSwap -- атрибут HTMX (метод запроса).
+// HxSwap -- атрибут HTMX (метод запроса, внеполосная замена).
 type HxSwap struct {
 	sync.RWMutex
-	val string
+	val defs.AStr
 }
 
 // NewHxUrlMethod -- возвращает новый метод запроса.
@@ -23,14 +24,14 @@ func NewHxUrlMethod() *HxSwap {
 }
 
 // Get -- возвращает хранимое значение метода запроса.
-func (sf *HxSwap) Get() string {
+func (sf *HxSwap) Get() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val
 }
 
 // Set -- устанавливает значение метода запроса.
-func (sf *HxSwap) Set(val string) {
+func (sf *HxSwap) Set(val defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val

+ 5 - 4
v4/lev2/wui/hx_url_patch/hx_url_patch.go

@@ -4,6 +4,7 @@ package hx_url_patch
 import (
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
 )
@@ -11,11 +12,11 @@ import (
 // HxUrlPatch -- атрибут HTMX (путь запроса).
 type HxUrlPatch struct {
 	sync.RWMutex
-	val string
+	val defs.AStr
 }
 
 // NewHxUrlPatch -- возвращает новый путь запроса.
-func NewHxUrlPatch(patch string) *HxUrlPatch {
+func NewHxUrlPatch(patch defs.AStr) *HxUrlPatch {
 	mKh.Hassert(patch != "", "NewHxUrlPatch(): patch isempty")
 	sf := &HxUrlPatch{
 		val: patch,
@@ -25,14 +26,14 @@ func NewHxUrlPatch(patch string) *HxUrlPatch {
 }
 
 // Get -- возвращает хранимое значение пути запроса.
-func (sf *HxUrlPatch) Get() string {
+func (sf *HxUrlPatch) Get() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val
 }
 
 // Set -- устанавливает значение пути запроса.
-func (sf *HxUrlPatch) Set(val string) {
+func (sf *HxUrlPatch) Set(val defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val

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

@@ -3,13 +3,14 @@ package wui
 
 import (
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_button"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
 )
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text string, fnClick func(map[string]string) mL0.IResult[string]) mWt.IWuiButton {
+func NewWuiButton(text defs.AStr, fnClick func(map[string]string) mL0.IResult[string]) mWt.IWuiButton {
 	wBtn := wui_button.NewWuiButton(text, fnClick)
 	return wBtn
 }

+ 6 - 5
v4/lev2/wui/wui_button/wui_button.go

@@ -5,6 +5,7 @@ import (
 	"strings"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_hx"
@@ -25,7 +26,7 @@ type WuiButton struct {
 type FnBtnBack func(map[string]string) mL0.IResult[string]
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text string, fnBack FnBtnBack) *WuiButton {
+func NewWuiButton(text defs.AStr, fnBack FnBtnBack) *WuiButton {
 	helpers.Hassert(fnBack != nil, "NewWuiButton(): text=%q, fnBack==nil", []any{text})
 	sf := &WuiButton{
 		IWuiWidget: wui_widget.NewWuiWidget(),
@@ -59,9 +60,9 @@ const (
 )
 
 // Html -- возвращает HTML-представление текста.
-func (sf *WuiButton) Html() string {
-	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id())
-	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.Get())
+func (sf *WuiButton) Html() defs.AStr {
+	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
+	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.Get().String())
 	strRes = strings.ReplaceAll(strRes, "{.hx}", sf.hx.String())
-	return strRes
+	return defs.AStr(strRes)
 }

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

@@ -29,7 +29,7 @@ func (sf *tester) new() {
 	if txt := btn.Text(); txt == nil {
 		sf.t.Fatalf("new(): IWuiText==nil")
 	}
-	if html := btn.Html(); html == "" {
+	if html := btn.Html(); html.Str() == "" {
 		sf.t.Fatalf("new(): html is empty")
 	}
 	if hx := btn.Hx(); hx == nil {

+ 2 - 1
v4/lev2/wui/wui_hx/wui_hx.go

@@ -2,6 +2,7 @@
 package wui_hx
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/hx_swap"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/hx_swap_oob"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/hx_target"
@@ -22,7 +23,7 @@ type WuiHx struct {
 }
 
 // NewWuiHx -- возвращает новые атрибуты HTMX для WUI-объекта.
-func NewWuiHx(path string) *WuiHx {
+func NewWuiHx(path defs.AStr) *WuiHx {
 	sf := &WuiHx{
 		url:     hx_url.NewHxUrl(path),
 		trigger: hx_trigger.NewHxTrigger(),

+ 6 - 5
v4/lev2/wui/wui_label/wui_label.go

@@ -5,6 +5,7 @@ import (
 	"strings"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_text"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
@@ -18,7 +19,7 @@ type WuiLabel struct {
 }
 
 // NewWuiLabel -- возвращает новую метку.
-func NewWuiLabel(text string) mL0.IResult[*WuiLabel] {
+func NewWuiLabel(text defs.AStr) mL0.IResult[*WuiLabel] {
 	sf := &WuiLabel{
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		text:       wui_text.NewWuiText(text),
@@ -39,8 +40,8 @@ const (
 )
 
 // Html -- возвращает HTML-представление текста.
-func (sf *WuiLabel) Html() string {
-	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id())
-	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.Get())
-	return strRes
+func (sf *WuiLabel) Html() defs.AStr {
+	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
+	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.Get().String())
+	return defs.AStr(strRes)
 }

+ 9 - 8
v4/lev2/wui/wui_text/wui_text.go

@@ -5,6 +5,7 @@ import (
 	"strings"
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_widget"
 )
@@ -13,11 +14,11 @@ import (
 type WuiText struct {
 	mWt.IWuiWidget
 	sync.RWMutex
-	val string
+	val defs.AStr
 }
 
 // NewWuiText -- возвращает новый текст WUI.
-func NewWuiText(val string) *WuiText {
+func NewWuiText(val defs.AStr) *WuiText {
 	sf := &WuiText{
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		val:        val,
@@ -31,23 +32,23 @@ const (
 )
 
 // Html -- возвращает HTML-представление текста.
-func (sf *WuiText) Html() string {
+func (sf *WuiText) Html() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
-	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id())
-	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.val)
-	return strRes
+	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
+	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.val.String())
+	return defs.AStr(strRes)
 }
 
 // Set -- устанавливает хранимое значение.
-func (sf *WuiText) Set(val string) {
+func (sf *WuiText) Set(val defs.AStr) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val
 }
 
 // Get -- возвращает хранимое значение.
-func (sf *WuiText) Get() string {
+func (sf *WuiText) Get() defs.AStr {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val

+ 4 - 2
v4/lev2/wui/wui_types/ihx_url_method.go

@@ -1,5 +1,7 @@
 package wui_types
 
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+
 // IHxUrlMethod -- атрибут метода HTMX.
 //
 // hx-get    // READ
@@ -9,7 +11,7 @@ package wui_types
 // hx-delete // DELETE.
 type IHxUrlMethod interface {
 	// Get -- возвращает метод атрибута
-	Get() string
+	Get() defs.AStr
 	// Set -- устанавливает метод атрибута
-	Set(string)
+	Set(defs.AStr)
 }

+ 4 - 2
v4/lev2/wui/wui_types/ihx_url_patch.go

@@ -1,9 +1,11 @@
 package wui_types
 
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+
 // IHxUrlPatch -- атрибут пути HTMX.
 type IHxUrlPatch interface {
 	// Get -- возвращает путь атрибута
-	Get() string
+	Get() defs.AStr
 	// Set -- устанавливает путь атрибута
-	Set(string)
+	Set(defs.AStr)
 }

+ 4 - 2
v4/lev2/wui/wui_types/iwui_text.go

@@ -1,10 +1,12 @@
 package wui_types
 
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+
 // IWuiText -- текст WUI.
 type IWuiText interface {
 	IWuiWidget
 	// Get -- возвращает текст
-	Get() string
+	Get() defs.AStr
 	// Set -- устанавливает текст
-	Set(string)
+	Set(defs.AStr)
 }

+ 5 - 2
v4/lev2/wui/wui_types/iwui_widget.go

@@ -1,9 +1,12 @@
 package wui_types
 
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+
 // IWuiWidget -- WUI виджет.
 type IWuiWidget interface {
+	defs.IStr
 	// Id -- возвращает Id виджета
-	Id() string
+	Id() defs.AStr
 	// Html -- возвращает HTML-представление виджета
-	Html() string
+	Html() defs.AStr
 }

+ 8 - 7
v4/lev2/wui/wui_widget/wui_widget.go

@@ -5,26 +5,27 @@ import (
 	"crypto/rand"
 	"strings"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
 )
 
 // WuiWidget -- базовый виджет WUI.
 type WuiWidget struct {
-	id string
+	defs.AStr
 }
 
 // NewWuiWidget -- возвращает новый базовый виджет WUI.
 func NewWuiWidget() *WuiWidget {
 	sf := &WuiWidget{
-		id: "wui_" + rand.Text(),
+		AStr: "wui_" + defs.AStr(rand.Text()),
 	}
 	_ = mWt.IWuiWidget(sf)
 	return sf
 }
 
 // Id - возвращает ID виджета.
-func (sf *WuiWidget) Id() string {
-	return sf.id
+func (sf *WuiWidget) Id() defs.AStr {
+	return sf.AStr
 }
 
 const (
@@ -32,7 +33,7 @@ const (
 )
 
 // Html -- возвращает HTML представление виджета.
-func (sf *WuiWidget) Html() string {
-	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.id)
-	return strRes
+func (sf *WuiWidget) Html() defs.AStr {
+	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.String())
+	return defs.AStr(strRes)
 }

+ 2 - 0
v4/lev3/mod_ent/mod_ent.go

@@ -40,6 +40,8 @@ type AModuleName = module_name.AModuleName
 type IModuleNameFix = module_name.IModuleNameFix
 
 // NewModuleNameFix -- создать новое уникальное имя модуля.
+//
+//go:fix inline
 func NewModuleNameFix(name AModuleName) IModuleNameFix {
 	return module_name.NewModuleName(name)
 }

+ 2 - 1
v4/lev3/mod_ent/mod_num/mod_num.go

@@ -8,6 +8,7 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
 // AModNum -- номер модуля.
@@ -46,7 +47,7 @@ func NewModuleNumFix() IModNumFix {
 func FromStr(strNumMod string) core_spec.IResult[IModNumFix] {
 	iNum, err := strconv.Atoi(strNumMod)
 	if err != nil {
-		err := fmt.Errorf("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", strNumMod, err)
+		err := defs.NewErr("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", strNumMod, err)
 		return lev0.NewErr[IModNumFix](err)
 	}
 	sf := &moduleNum{

+ 22 - 0
v4/lev3/mod_ent/module_name/module_name.go

@@ -2,6 +2,7 @@
 package module_name
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
@@ -10,6 +11,7 @@ type AModuleName string
 
 // IModuleNameFix -- фиксированное имя модуля.
 type IModuleNameFix interface {
+	defs.IStr
 	// Get -- получить имя модуля
 	Get() AModuleName
 	// String -- строковое представление имени модуля
@@ -30,6 +32,11 @@ func NewModuleName(val AModuleName) *ModuleName {
 	return sf
 }
 
+// Str -- возвращает внутреннюю строку.
+func (sf *ModuleName) Str() defs.AStr {
+	return defs.AStr(sf.name)
+}
+
 // String -- строковое представление.
 //
 //go:fix inline
@@ -41,3 +48,18 @@ func (sf *ModuleName) String() string {
 func (sf *ModuleName) Get() AModuleName {
 	return sf.name
 }
+
+// Byte -- возвращает байты.
+func (sf *ModuleName) Byte() []byte {
+	return []byte(sf.name)
+}
+
+// Rune -- возвращает руны.
+func (sf *ModuleName) Rune() []rune {
+	return []rune(sf.name)
+}
+
+// Len -- длина строки.
+func (sf *ModuleName) Len() defs.Int {
+	return defs.Int(len(sf.name))
+}

+ 3 - 1
v4/lev3/mod_kctx/mod_kctx.go

@@ -5,6 +5,7 @@ import (
 	"sync"
 
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
@@ -54,7 +55,8 @@ func GetModuleKernelCtx() *ModuleKernelCtx {
 
 // Run -- запускает модуль в работу.
 func (sf *ModuleKernelCtx) Run() {
-	sf.log.Info("ModuleKernelCtx.Run(): module=%v, is run", sf.Name())
+	msg := defs.Str("ModuleKernelCtx.Run(): module=%v, is run", sf.Name())
+	sf.log.Info(msg)
 	go sf.kServHttp.Run()
 }
 

+ 2 - 1
v4/lev3/mod_kctx/mod_kctx_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -39,7 +40,7 @@ func TestModKernelCtx(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.kCtx.Set("monolitName", "test_monolit", "test")
+	sf.kCtx.Set(defs.Str("monolitName"), "test_monolit", defs.Str("test"))
 	sf.new()
 	sf.done()
 }

+ 2 - 1
v4/lev3/mod_keeper/mod_keeper_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -39,7 +40,7 @@ func TestModKeeper(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.kCtx.Set("monolitName", "test_monolit", "test")
+	sf.kCtx.Set(defs.Str("monolitName"), "test_monolit", defs.Str("test"))
 	sf.new()
 	sf.done()
 }

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

@@ -7,6 +7,7 @@ import (
 	"strings"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui"
@@ -30,7 +31,7 @@ func NewBtnModules() *BtnModules {
 }
 
 // Html -- возвращает HTML-представление кнопки.
-func (sf *BtnModules) Html() string {
+func (sf *BtnModules) Html() defs.AStr {
 	return sf.btn.Html()
 }
 
@@ -44,21 +45,21 @@ var strBlockRow 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")
+		err := defs.NewErr("clickMonolit(): monolit module not found")
 		return mL0.NewErr[string](err)
 	}
 	mon := optMonolit.Some().Val().(mod_spec.IKernelMonolit)
 	chLst := mon.Ctx().SortedList()
 	strOut := ``
 	for _, val := range chLst {
-		if !strings.Contains(val.Key(), "module_") {
+		if !strings.Contains(val.Key().String(), "module_") {
 			continue
 		}
-		lstKey := strings.Split(val.Key(), "_")
+		lstKey := strings.Split(val.Key().String(), "_")
 		id := lstKey[1]
 		strRow := strBlockRow
 		strRow = strings.ReplaceAll(strRow, "{.id}", id)
-		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key())
+		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key().String())
 		moduleName := val.Val().(mod_spec.IKernelModule).Name().Get()
 		strRow = strings.ReplaceAll(strRow, "{.name}", string(moduleName))
 		type_ := fmt.Sprintf("%#T", val.Val())
@@ -66,7 +67,7 @@ func (sf *BtnModules) clickMonolit(dict map[string]string) mL0.IResult[string] {
 		strRow = strings.ReplaceAll(strRow, "{.type}", type_)
 		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().String())
 		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().String())
-		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
+		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment().String())
 		strOut += strRow
 	}
 	strOut = strings.ReplaceAll(strBlockModules, "{.mod_block}", strOut)

+ 2 - 1
v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go

@@ -5,6 +5,7 @@ import (
 	_ "embed"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
 )
@@ -22,7 +23,7 @@ func NewBtnMonolit() *BtnMonolit {
 }
 
 // Html -- возвращает HTML-представление кнопки.
-func (sf *BtnMonolit) Html() string {
+func (sf *BtnMonolit) Html() defs.AStr {
 	return sf.btn.Html()
 }
 

+ 2 - 3
v4/lev3/mod_serv_http/http_api/http_api.go

@@ -2,12 +2,11 @@
 package http_api
 
 import (
-	"fmt"
-
 	"github.com/gofiber/fiber/v3"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
@@ -21,7 +20,7 @@ func NewHttpApi() mL0.IResult[*HttpApi] {
 	kCtx := kctx.GetKernelCtx()
 	optFiber := kCtx.Get("fiberApp")
 	if optFiber.IsNone() {
-		err := fmt.Errorf("NewHttpApi(): not found fiberApp in kernel ctx")
+		err := defs.NewErr("NewHttpApi(): not found fiberApp in kernel ctx")
 		return mL0.NewErr[*HttpApi](err)
 	}
 	fiberApp := optFiber.Some().Val().(*fiber.App)

+ 6 - 5
v4/lev3/mod_serv_http/page_module/page_module.go

@@ -9,6 +9,7 @@ import (
 	"github.com/gofiber/fiber/v3"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -31,7 +32,7 @@ func GetPageModule() mL0.IResult[*PageModule] {
 	kCtx := kctx.GetKernelCtx()
 	optFiber := kCtx.Get("fiberApp")
 	if optFiber.IsNone() {
-		err := fmt.Errorf("GetPageModule(): not found fiberApp in kernel ctx")
+		err := defs.NewErr("GetPageModule(): not found fiberApp in kernel ctx")
 		return mL0.NewErr[*PageModule](err)
 	}
 	fiberApp := optFiber.Some().Val().(*fiber.App)
@@ -75,7 +76,7 @@ func (sf *PageModule) postModuleLog(ctx fiber.Ctx) error {
 	}
 
 	strOut := ""
-	for i := range 100 {
+	for i := range defs.Int(100) {
 		msg := _log.Get(i).String()
 		if strings.Contains(msg, "*no msg*") {
 			continue
@@ -120,7 +121,7 @@ func (sf *PageModule) postModuleCtx(ctx fiber.Ctx) error {
 	strOut := ""
 	for _, val := range lst {
 		strRow := strCtxRowVal
-		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key())
+		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key().String())
 		_val := val.Val()
 		valShort := fmt.Sprint(_val)
 		runes := []rune(valShort)
@@ -134,7 +135,7 @@ func (sf *PageModule) postModuleCtx(ctx fiber.Ctx) error {
 		strRow = strings.ReplaceAll(strRow, "{.type}", _type)
 		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().String())
 		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().String())
-		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
+		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment().String())
 		strOut += strRow
 	}
 	strOut = strings.ReplaceAll(strCtxRowBlock, "{.ctx_block}", strOut)
@@ -289,7 +290,7 @@ func (sf *PageModule) getModule(modNum mod_num.IModNumFix) (mod_spec.IKernelModu
 	)
 	for _, val = range chLst {
 		name := "module_" + modNum.String()
-		if name == val.Key() {
+		if name == val.Key().String() {
 			isFind = true
 			break
 		}

+ 12 - 10
v4/lev3/mod_serv_http/page_monolit/page_monolit.go

@@ -9,6 +9,7 @@ import (
 
 	"github.com/gofiber/fiber/v3"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/btn_modules"
@@ -41,8 +42,9 @@ func GetPageMonolit() *PageMonolit {
 		btnModules: btn_modules.NewBtnModules(),
 	}
 
-	optFiber := sf.kCtx.Get("fiberApp")
-	optFiber.Hassert("GetPageMonolit(): mod='monolit', not found fiberApp in kernel ctx")
+	optFiber := sf.kCtx.Get(defs.Str("fiberApp"))
+	optFiber.Hassert(
+		defs.Str("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)
@@ -62,7 +64,7 @@ var strLogBlock string
 
 // Возвращает страницу лога монолита.
 func (sf *PageMonolit) postMonolitLog(ctx fiber.Ctx) error {
-	optMonolit := sf.kCtx.Get("monolit")
+	optMonolit := sf.kCtx.Get(defs.Str("monolit"))
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitLog(): mod='monolit', not found monolit in kernel ctx")
 		return err
@@ -71,7 +73,7 @@ func (sf *PageMonolit) postMonolitLog(ctx fiber.Ctx) error {
 	_log := mon.Log()
 	strOut := ""
 	for i := range 100 {
-		msg := _log.Get(i).String()
+		msg := _log.Get(defs.Int(i)).String()
 		if strings.Contains(msg, "*no msg*") {
 			continue
 		}
@@ -89,7 +91,7 @@ var strCtxRowBlock string
 
 // Возвращает блок контекста монолита.
 func (sf *PageMonolit) postMonolitCtx(ctx fiber.Ctx) error {
-	optMon := sf.kCtx.Get("monolit")
+	optMon := sf.kCtx.Get(defs.Str("monolit"))
 	if optMon.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitCtx(): mod='monolit', not found monolit in kernel ctx")
 		return err
@@ -99,14 +101,14 @@ func (sf *PageMonolit) postMonolitCtx(ctx fiber.Ctx) error {
 	strOut := ``
 	for _, val := range chLst {
 		strRow := strCtxRowVal
-		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key())
+		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key().String())
 		strRow = strings.ReplaceAll(strRow, "{.value}", fmt.Sprint(val.Val()))
 		type_ := fmt.Sprintf("%#T", val.Val())
 		type_ = strings.ReplaceAll(type_, ".", ",<br>")
 		strRow = strings.ReplaceAll(strRow, "{.type}", type_)
 		strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().String())
 		strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().String())
-		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
+		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment().String())
 		strOut += strRow
 	}
 	strOut = strings.ReplaceAll(strCtxRowBlock, "{.ctx_block}", strOut)
@@ -119,7 +121,7 @@ var strStateMonolit string
 // Показывает состояние монолита.
 func (sf *PageMonolit) postMonolitState(ctx fiber.Ctx) error {
 	dictState := map[string]any{}
-	optMonolit := sf.kCtx.Get("monolit")
+	optMonolit := sf.kCtx.Get(defs.Str("monolit"))
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitState(): mod='monolit', not found monolit from kernel ctx")
 		return err
@@ -143,7 +145,7 @@ var strPageMonolit string
 // Индексная страница монолита.
 func (sf *PageMonolit) getMonolit(ctx fiber.Ctx) error {
 	ctx.Set("Content-type", "text/html; charset=utf8;\n\n")
-	strOut := strings.ReplaceAll(strPageMonolit, "{.btn_monolit}", sf.btnMonolit.Html())
-	strOut = strings.ReplaceAll(strOut, "{.btn_modules}", sf.btnModules.Html())
+	strOut := strings.ReplaceAll(strPageMonolit, "{.btn_monolit}", sf.btnMonolit.Html().String())
+	strOut = strings.ReplaceAll(strOut, "{.btn_modules}", sf.btnModules.Html().String())
 	return ctx.SendString(strOut)
 }

+ 7 - 5
v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go

@@ -6,6 +6,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmonolit"
@@ -37,11 +38,11 @@ func TestPageMonolit(t *testing.T) {
 // Возвращает состояние лога монолита.
 func (sf *tester) postMonolitLog() {
 	sf.t.Log("postMonolitCtx")
-	mon := sf.ctx.Get("monolit").
-		Hassert("postMonolitLog()").
+	mon := sf.ctx.Get(defs.Str("monolit")).
+		Hassert(defs.Str("postMonolitLog()")).
 		Val().(mod_spec.IKernelMonolit)
 	log := mon.Log()
-	log.Debug("test msg")
+	log.Debug(defs.Str("test msg"))
 	fiberApp := sf.serv.Fiber()
 	req, err := http.NewRequest(http.MethodPost, "/monolit_log", nil)
 	if err != nil {
@@ -133,10 +134,11 @@ 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")
+	strLocal := defs.Str("isLocal")
+	sf.ctx.Set(strLocal, true, defs.Str("testing"))
 	for {
 		time.Sleep(time.Millisecond * 1)
-		if sf.ctx.Get("isLocal") != nil {
+		if sf.ctx.Get(strLocal) != nil {
 			break
 		}
 	}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików