فهرست منبع

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

SVI 4 ماه پیش
والد
کامیت
14c7165749
35فایلهای تغییر یافته به همراه497 افزوده شده و 424 حذف شده
  1. 7 5
      v4/kern.go
  2. 1 1
      v4/kern_test.go
  3. 4 17
      v4/lev0/core_spec/ioption.go
  4. 4 21
      v4/lev0/core_spec/iresult.go
  5. 2 2
      v4/lev0/core_spec/isafe_bool.go
  6. 7 4
      v4/lev0/core_spec/isafe_string.go
  7. 45 0
      v4/lev0/defs/def_err/def_err.go
  8. 13 0
      v4/lev0/defs/def_int/def_int.go
  9. 9 0
      v4/lev0/defs/def_spec/def_err.go
  10. 19 0
      v4/lev0/defs/def_spec/def_option.go
  11. 23 0
      v4/lev0/defs/def_spec/def_result.go
  12. 19 0
      v4/lev0/defs/def_spec/def_spec.go
  13. 27 0
      v4/lev0/defs/def_spec/def_txt.go
  14. 97 0
      v4/lev0/defs/def_txt/def_txt.go
  15. 16 183
      v4/lev0/defs/defs.go
  16. 7 7
      v4/lev0/helpers/helpers.go
  17. 2 1
      v4/lev0/lev0.go
  18. 6 6
      v4/lev0/option/option.go
  19. 19 19
      v4/lev0/option/option_test.go
  20. 0 6
      v4/lev0/proton/neutron.go
  21. 29 26
      v4/lev0/result/result.go
  22. 31 29
      v4/lev0/result/result_test.go
  23. 5 2
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go
  24. 5 4
      v4/lev2/lti/bus_spec/ikernel_bus.go
  25. 2 2
      v4/lev2/lti/dot/msg_pub/msg_pub_test.go
  26. 2 2
      v4/lev2/lti/dot/msg_serve/msg_serve_test.go
  27. 3 3
      v4/lev2/lti/dot/msg_sub/msg_sub_test.go
  28. 2 2
      v4/lev2/lti/dot/msg_unsub/msg_unsub_test.go
  29. 13 10
      v4/lev2/lti/kbus_base/kbus_base.go
  30. 5 3
      v4/lev2/lti/kbus_base/kbus_base_test.go
  31. 16 14
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go
  32. 7 7
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go
  33. 41 35
      v4/lev2/lti/kbus_http/kbus_http.go
  34. 2 1
      v4/lev2/lti/kbus_http/kbus_http_test.go
  35. 7 12
      v4/lev3/mod_ent/mod_num/mod_num.go

+ 7 - 5
v4/kern.go

@@ -84,7 +84,9 @@ func NewSafeBool(val bool) ISafeBool {
 // GetKernelBusLocal -- возвращает локальную шину данных.
 func GetKernelBusLocal() bus_spec.IKernelBus {
 	kCtx := kctx.GetKernelCtx()
-	kCtx.Set(defs.Txt("monolitName"), "unknown monolit", defs.Txt("GetKernelBusLocal()"))
+	kCtx.Set(defs.TxtFix("monolitName"),
+		"unknown monolit",
+		defs.TxtFix("GetKernelBusLocal()"))
 	lBus := kbus_local.GetKernelBusLocal()
 	return lBus
 }
@@ -107,10 +109,10 @@ func SleepMs() {
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
 func GetMonolitLocal(name mod_ent.AModuleName) mod_spec.IKernelMonolit {
 	kCtx := kctx.GetKernelCtx()
-	kCtx.Set(defs.Txt("isLocal"), true, defs.Txt("bus type"))
+	kCtx.Set(defs.TxtFix("isLocal"), true, defs.TxtFix("bus type"))
 	for {
 		time.Sleep(time.Millisecond * 1)
-		optIsLocal := kCtx.Get(defs.Txt("isLocal"))
+		optIsLocal := kCtx.Get(defs.TxtFix("isLocal"))
 		if optIsLocal.IsSome() {
 			break
 		}
@@ -124,10 +126,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(defs.Txt("isLocal"), false, defs.Txt("bus type"))
+	kCtx.Set(defs.TxtFix("isLocal"), false, defs.TxtFix("bus type"))
 	for {
 		time.Sleep(time.Millisecond * 1)
-		optIsLocal := kCtx.Get(defs.Txt("isLocal"))
+		optIsLocal := kCtx.Get(defs.TxtFix("isLocal"))
 		if optIsLocal.IsSome() {
 			break
 		}

+ 1 - 1
v4/kern_test.go

@@ -153,7 +153,7 @@ func (sf *tester) new1() {
 	if clientLocal == nil {
 		sf.t.Fatalf("new1(): (local) IBusClient==nil")
 	}
-	clientHttp := NewClientBusHttp(defs.Txt("test_url"))
+	clientHttp := NewClientBusHttp(defs.TxtFix("test_url"))
 	if clientHttp == nil {
 		sf.t.Fatalf("new1(): (http) IBusClient==nil")
 	}

+ 4 - 17
v4/lev0/core_spec/ioption.go

@@ -1,21 +1,8 @@
 package core_spec
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+)
 
 // IOption -- интерфейс опции.
-type IOption[T any] interface {
-	// IsSome - проверяет, есть ли значение.
-	IsSome() bool
-	// IsNone - проверяет, есть ли значение.
-	IsNone() bool
-	// Some - извлекает значение (паника, если None).
-	Some() T
-	// SomeOr - возвращает значение или дефолтное.
-	SomeOr(defaultValue T) T
-	// SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
-	SomeOrFn(fn func() T) T
-	// Hassert -- проверяет, что не пустое значение (с паникой).
-	Hassert(msgFormat defs.ITxtFix, args ...any) T
-	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-	Assert(msgFormat defs.ITxtFix, args ...any) T
-}
+type IOption[T any] = def_spec.IOption[T]

+ 4 - 21
v4/lev0/core_spec/iresult.go

@@ -1,25 +1,8 @@
 package core_spec
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
 
 // IResult -- возвращаемый результат.
-type IResult[T any] interface {
-	// IsOk -- возвращает true, если Result содержит значение.
-	IsOk() bool
-	// IsErr -- возвращает true, если Result содержит ошибку.
-	IsErr() bool
-	// Ok -- возвращает значение, если оно есть, иначе паникует.
-	Ok() T
-	// OkOr -- возвращает значение, если оно есть, или значение по умолчанию.
-	OkOr(defaultValue T) T
-	// OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
-	OkOrFn(fn func() T) T
-	// Err -- возвращает ошибку, если она есть.
-	Err() defs.IErr
-	// Error -- возвращает строковое представление ошибки, если она есть.
-	Error() string
-	// Hassert -- проверяет, что нет ошибки (с паникой).
-	Hassert(msgFormat defs.ITxtFix, args ...any) T
-	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-	Assert(msgFormat defs.ITxtFix, args ...any) T
-}
+type IResult[T any] = result.IResult[T]

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

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

+ 7 - 4
v4/lev0/core_spec/isafe_string.go

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

+ 45 - 0
v4/lev0/defs/def_err/def_err.go

@@ -0,0 +1,45 @@
+// package def_err -- базовый тип ошибки
+package def_err
+
+import (
+	"fmt"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+)
+
+// KErr -- обёрнутая ошибка.
+type KErr struct {
+	def_spec.ITxtFix
+}
+
+// Err -- создать новую обёрнутую ошибку.
+func Err(msg def_spec.ATxt, arg ...any) *KErr {
+	helpers.Hassert(msg == "", "Err(): msg is empty")
+	_msg := fmt.Sprintf(string(msg), arg...)
+	sf := &KErr{
+		ITxtFix: def_txt.Txt(_msg),
+	}
+	_ = def_spec.IErr(sf)
+	return sf
+}
+
+// WrapErr -- возвращает обёрнутую ошибку.
+func WrapErr(err error) def_spec.IErr {
+	_msg := def_txt.TxtFix(err.Error())
+	sf := &KErr{
+		ITxtFix: _msg,
+	}
+	return sf
+}
+
+// IsErr -- возвращает true, если ошибка.
+func (sf *KErr) IsErr() bool {
+	return sf.Get() != ""
+}
+
+// Error -- возвращает хранимую ошибку.
+func (sf *KErr) Error() string {
+	return sf.String()
+}

+ 13 - 0
v4/lev0/defs/def_int/def_int.go

@@ -0,0 +1,13 @@
+// package def_int -- базовый тип числа
+package def_int
+
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+
+type Int struct{
+	val def_spec.Int
+}
+
+// Get -- возвращает целое число по требованию.
+func (sf *Int) Get() int {
+	return int(sf.val)
+}

+ 9 - 0
v4/lev0/defs/def_spec/def_err.go

@@ -0,0 +1,9 @@
+package def_spec
+
+// IErr -- алиас для error.
+type IErr interface {
+	error
+	ITxtFix
+	// IsErr -- возвращает true, если ошибка.
+	IsErr() bool
+}

+ 19 - 0
v4/lev0/defs/def_spec/def_option.go

@@ -0,0 +1,19 @@
+package def_spec
+
+// IOption -- интерфейс опции.
+type IOption[T any] interface {
+	// IsSome - проверяет, есть ли значение.
+	IsSome() bool
+	// IsNone - проверяет, есть ли значение.
+	IsNone() bool
+	// Some - извлекает значение (паника, если None).
+	Some() T
+	// SomeOr - возвращает значение или дефолтное.
+	SomeOr(defaultValue T) T
+	// SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
+	SomeOrFn(fn func() T) T
+	// Hassert -- проверяет, что не пустое значение (с паникой).
+	Hassert(msgFormat ATxt, args ...any) T
+	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
+	Assert(msgFormat ATxt, args ...any) T
+}

+ 23 - 0
v4/lev0/defs/def_spec/def_result.go

@@ -0,0 +1,23 @@
+package def_spec
+
+// IResult -- возвращаемый результат.
+type IResult[T any] interface {
+	// IsOk -- возвращает true, если Result содержит значение.
+	IsOk() bool
+	// IsErr -- возвращает true, если Result содержит ошибку.
+	IsErr() bool
+	// Ok -- возвращает значение, если оно есть, иначе паникует.
+	Ok() T
+	// OkOr -- возвращает значение, если оно есть, или значение по умолчанию.
+	OkOr(defaultValue T) T
+	// OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
+	OkOrFn(fn func() T) T
+	// Err -- возвращает ошибку, если она есть.
+	Err() error
+	// Error -- возвращает строковое представление ошибки, если она есть.
+	Error() string
+	// Hassert -- проверяет, что нет ошибки (с паникой).
+	Hassert(msgFormat ATxt, args ...any) T
+	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
+	Assert(msgFormat ATxt, args ...any) T
+}

+ 19 - 0
v4/lev0/defs/def_spec/def_spec.go

@@ -0,0 +1,19 @@
+// package def_spec -- внутренние спецификации типы
+package def_spec
+
+// Int -- алиас для int.
+type Int int
+
+// ATxt -- алиас для внутренней строки.
+type ATxt string
+
+// IString -- интерфейс к стандартной строке.
+type IString interface {
+	// String -- возвращает стандартную строку
+	String() string
+}
+
+// TxtConstraint -- разрешает string и любые типы на его основе (например, ATxt).
+type TxtConstraint interface {
+	~string
+}

+ 27 - 0
v4/lev0/defs/def_spec/def_txt.go

@@ -0,0 +1,27 @@
+package def_spec
+
+// ITxtFix -- интерфейс к фиксированной внутренней строке.
+type ITxtFix interface {
+	IString
+	// Get -- возвращает внутреннюю строку
+	Get() ATxt
+	// Len -- возвращает длину внутренней строки
+	Len() Int
+	// Byte -- возвращает внутреннюю строку в виде байтов.
+	Byte() []byte
+	// Rune -- возвращает внутреннюю строку в виде рун.
+	Rune() []rune
+	// TrimSuffix -- обрезает суффикс строки
+	TrimSuffix(any) ITxtFix
+	// Concat -- объединяет строки
+	Concat(msg any, arg ...any) ITxtFix
+	// Atoi -- пытается еовертироватьв число
+	Atoi() IResult[Int]
+}
+
+// ITxtMut -- интерфейс к изменяемой внутренней строке.
+type ITxtMut interface {
+	ITxtFix
+	// Set -- устанавливает внутреннюю строку
+	Set(ATxt)
+}

+ 97 - 0
v4/lev0/defs/def_txt/def_txt.go

@@ -0,0 +1,97 @@
+// package def_txt -- базовый тип текста
+package def_txt
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// KTxt -- алиас для внутренней строки.
+type KTxt struct {
+	val def_spec.ATxt
+}
+
+
+// Txt -- создать новую строку.
+func Txt[T def_spec.TxtConstraint](msg T, arg ...any) *KTxt {
+	_msg := fmt.Sprintf(string(msg), arg...)
+	sf := &KTxt{
+		val: def_spec.ATxt(_msg),
+	}
+	return sf
+}
+
+// TxtFix -- создать новую строку.
+func TxtFix[T def_spec.TxtConstraint](msg T, arg ...any) def_spec.ITxtFix {
+	sf := Txt(msg, arg...)
+	return sf
+}
+
+// TxtMut -- создать новую мутабельную строку.
+func TxtMut[T def_spec.TxtConstraint](msg T, arg ...any) def_spec.ITxtMut {
+	_msg := fmt.Sprintf(string(msg), arg...)
+	sf := &KTxt{
+		val: def_spec.ATxt(_msg),
+	}
+	return sf
+}
+
+// Get -- возвращает внутреннюю строку.
+func (sf KTxt) Get() def_spec.ATxt {
+	return sf.val
+}
+
+// Concat -- создать новую строку.
+func (sf *KTxt) Concat(msg any, arg ...any) def_spec.ITxtFix {
+	val := fmt.Sprintf("%v", msg)
+	val = fmt.Sprintf(val, arg...)
+	_msg := string(sf.val) + val
+	sf.val = def_spec.ATxt(_msg)
+	return sf
+}
+
+// TrimSuffix -- обрезает суффикс строки.
+func (sf *KTxt) TrimSuffix(suffix any) def_spec.ITxtFix {
+	suf := fmt.Sprintf("%v", suffix)
+	txt := strings.TrimSuffix(string(sf.val), suf)
+	return Txt(txt)
+}
+
+// Set -- изменение внутренней строки.
+func (sf *KTxt) Set(msg def_spec.ATxt) {
+	sf.val = msg
+}
+
+// Rune -- возвращает внутреннюю строку в виде рун.
+func (sf KTxt) Rune() []rune {
+	return []rune(sf.val)
+}
+
+// Byte -- возвращает внутреннюю строку в виде байтов.
+func (sf KTxt) Byte() []byte {
+	return []byte(sf.val)
+}
+
+// Len -- возвращает длину строки.
+func (sf KTxt) Len() def_spec.Int {
+	return def_spec.Int(len(sf.val))
+}
+
+// String -- возвращает строку по требованию.
+func (sf KTxt) String() string {
+	return string(sf.val)
+}
+
+// Atoi -- возвращает возможное число
+func (sf KTxt) Atoi() def_spec.IResult[def_spec.Int] {
+	iRes,err:=strconv.Atoi(sf.String())
+	if err!=nil{
+		err:=fmt.Errorf("KTxt.Atot(): val(%q) not int, err=\n\t%w", err)
+		return result.NewErr[def_spec.Int](err)
+	}
+	return result.NewOk(def_spec.Int(iRes))
+}

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

@@ -2,201 +2,34 @@
 package defs
 
 import (
-	"fmt"
-	"strings"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
 )
 
-// "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
+// Int -- внутренне представление числа
+type Int = def_spec.Int
 
-// Int -- алиас для int.
-type Int int
+// ATxt -- внутренее пресдатвление текста
+type ATxt = def_spec.ATxt
 
-// Int -- возвращает целое число по требованию.
-func (i Int) Int() int {
-	return int(i)
-}
-
-// ITxtFix -- интерфейс к фиксированной внутренней строке.
-type ITxtFix interface {
-	// Get -- возвращает внутреннюю строку
-	Get() ATxt
-	// String -- возвращает строку
-	String() string
-	// Len -- возвращает длину внутренней строки
-	Len() Int
-	// Byte -- возвращает внутреннюю строку в виде байтов.
-	Byte() []byte
-	// Rune -- возвращает внутреннюю строку в виде рун.
-	Rune() []rune
-	// TrimSuffix -- обрезает суффикс строки
-	TrimSuffix(any) ITxtFix
-	// Concat -- объединяет строки
-	Concat(msg any, arg ...any) ITxtFix
-}
-
-// ITxtMut -- интерфейс к изменяемой внутренней строке.
-type ITxtMut interface {
-	ITxtFix
-	// Set -- устанавливает внутреннюю строку
-	Set(ATxt)
-}
-
-// ATxt -- алиас для внутренней строки.
-type ATxt string
-
-// KTxt -- алиас для внутренней строки.
-type KTxt struct {
-	val ATxt
-}
-
-// TxtConstraint -- разрешает string и любые типы на его основе (например, ATxt).
-type TxtConstraint interface {
-	~string
-}
-
-// Txt -- создать новую строку.
-func Txt[T TxtConstraint](msg T, arg ...any) *KTxt {
-	_msg := fmt.Sprintf(string(msg), arg...)
-	sf := &KTxt{
-		val: ATxt(_msg),
-	}
-	return sf
-}
-
-// TxtFix -- создать новую строку.
-func TxtFix[T TxtConstraint](msg T, arg ...any) ITxtFix {
-	sf := Txt(msg, arg...)
-	return sf
-}
-
-// TxtMut -- создать новую мутабельную строку.
-func TxtMut[T TxtConstraint](msg T, arg ...any) ITxtMut {
-	_msg := fmt.Sprintf(string(msg), arg...)
-	sf := &KTxt{
-		val: ATxt(_msg),
-	}
-	return sf
-}
-
-// Get -- возвращает внутреннюю строку.
-func (sf KTxt) Get() ATxt {
-	return sf.val
-}
+// ITxtFix -- внутренне представление строки
+type ITxtFix = def_spec.ITxtFix
 
-// Concat -- создать новую строку.
-func (sf *KTxt) Concat(msg any, arg ...any) ITxtFix {
-	val := fmt.Sprintf("%v", msg)
-	val = fmt.Sprintf(val, arg...)
-	_msg := string(sf.val) + val
-	sf.val = ATxt(_msg)
+// TxtFix -- возвращает новый внутренний текст
+func TxtFix[T def_spec.TxtConstraint](msg T, arg ...any) ITxtFix {
+	sf := def_txt.Txt(msg, arg...)
 	return sf
 }
 
-// TrimSuffix -- обрезает суффикс строки.
-func (sf *KTxt) TrimSuffix(suffix any) ITxtFix {
-	suf := fmt.Sprintf("%v", suffix)
-	txt := strings.TrimSuffix(string(sf.val), suf)
-	return Txt(txt)
-}
-
-// Set -- изменение внутренней строки.
-func (sf *KTxt) Set(msg ATxt) {
-	sf.val = msg
-}
 
-// Rune -- возвращает внутреннюю строку в виде рун.
-func (sf KTxt) Rune() []rune {
-	return []rune(sf.val)
-}
 
-// Byte -- возвращает внутреннюю строку в виде байтов.
-func (sf KTxt) Byte() []byte {
-	return []byte(sf.val)
-}
-
-// Len -- возвращает длину строки.
-func (sf KTxt) Len() Int {
-	return Int(len(sf.val))
-}
-
-// String -- возвращает строку по требованию.
-func (sf KTxt) String() string {
-	return string(sf.val)
-}
-
-// IErr -- алиас для error.
-type IErr interface {
-	error
-	ITxtFix
-	// IsErr -- возвращает true, если ошибка.
-	IsErr() bool
-}
-
-// KErr -- обёрнутая ошибка.
-type KErr struct {
-	err error
-}
+// IErr -- внутренне представление ошибки
+type IErr = def_spec.IErr
 
 // Err -- создать новую обёрнутую ошибку.
 func Err(msg ATxt, arg ...any) IErr {
-	err := fmt.Errorf(string(msg), arg...)
-	return &KErr{err}
-}
-
-// WrapErr -- возвращает обёрнутую ошибку.
-func WrapErr(err error) IErr {
-	return &KErr{err}
-}
-
-// TrimSuffix -- обрезает суффикс строки.
-func (e *KErr) TrimSuffix(suffix any) ITxtFix {
-	suf := fmt.Sprintf("%v", suffix)
-	txt := strings.TrimSuffix(e.err.Error(), suf)
-	return Txt(txt)
-}
-
-// Rune -- возвращает внутреннюю строку в виде рун.
-func (e *KErr) Rune() []rune {
-	return []rune(e.err.Error())
-}
-
-// Byte -- возвращает байты из ошибки.
-func (e *KErr) Byte() []byte {
-	return []byte(e.err.Error())
-}
-
-// IsErr -- возвращает true, если ошибка.
-func (e *KErr) IsErr() bool {
-	return e.err != nil
-}
-
-// String -- возвращает строковое представление ошибки.
-func (e *KErr) String() string {
-	return e.err.Error()
-}
-
-// Error -- возвращает хранимую ошибку.
-func (e *KErr) Error() string {
-	return e.err.Error()
-}
-
-// Get -- возвращает строку по требованию для ошибки.
-func (e *KErr) Get() ATxt {
-	return ATxt(e.err.Error())
-}
-
-// Len -- возвращает длину ошибки.
-func (e *KErr) Len() Int {
-	return Int(len(e.err.Error()))
-}
-
-// Concat -- создать новую строку.
-func (sf *KErr) Concat(msg any, arg ...any) ITxtFix {
-	val := fmt.Sprintf("%v", msg)
-	val = fmt.Sprintf(val, arg...)
-	_msg := sf.err.Error() + val
-	sf.err = fmt.Errorf("%v%v", sf.err.Error(), _msg)
-	return sf
+	return def_err.Err(msg, arg...)
 }
 
 // ITimeFix -- метка времени.
@@ -204,7 +37,7 @@ func (sf *KErr) Concat(msg any, arg ...any) ITxtFix {
 type ITimeFix ITxtFix
 
 // BucketName -- имя сущности.
-type BucketName KTxt
+type BucketName ITxtFix
 
 // StreamName -- имя потока для ожидания.
 // type StreamName = stream_name.AStreamName

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

@@ -9,7 +9,7 @@ import (
 	"os"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 )
 
 var (
@@ -20,14 +20,14 @@ var (
 // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
 //
 //	(isCond bool, msgFormat defs.Str, args ...any)
-type FnAssert func(isCond bool, msgFormat defs.ATxt, args ...any)
+type FnAssert func(isCond bool, msgFormat def_spec.ATxt, args ...any)
 
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
-func Assert(isCond bool, msgFormat defs.ATxt, args ...any) {
+func Assert(isCond bool, msgFormat def_spec.ATxt, args ...any) {
 	if isCond {
 		return
 	}
-	msg := defs.Txt("SOFT ASSERT ").Concat(msgFormat+"\n", args)
+	msg := fmt.Sprintf("SOFT ASSERT "+string(msgFormat)+"\n", args...)
 	if IsStageLocal {
 		panic(msg)
 	}
@@ -37,14 +37,14 @@ func Assert(isCond bool, msgFormat defs.ATxt, args ...any) {
 // FnHassert -- проверяет с жёстким падением условие.
 //
 //	(isCond bool, msgFormat defs.Str, args ...any)
-type FnHassert func(isCond bool, msgFormat defs.ATxt, args ...any)
+type FnHassert func(isCond bool, msgFormat def_spec.ATxt, args ...any)
 
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
-func Hassert(isCond bool, msgFormat defs.ATxt, args ...any) {
+func Hassert(isCond bool, msgFormat def_spec.ATxt, args ...any) {
 	if isCond {
 		return
 	}
-	msg := defs.Txt("HARD ASSERT ").Concat(msgFormat+"\n", args...)
+	msg := fmt.Sprintf("HARD ASSERT "+string(msgFormat)+"\n", args...)
 	panic(msg)
 }
 

+ 2 - 1
v4/lev0/lev0.go

@@ -6,6 +6,7 @@ import (
 
 	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/defs/def_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
 	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
@@ -18,7 +19,7 @@ type ETime = mKs.ITime
 type EStr = mKs.EStr
 
 // Result — обёртка вокруг результата с возможной ошибкой.
-type IResult[T any] = mKs.IResult[T]
+type IResult[T any] = def_spec.IResult[T]
 
 // NewOk -- возвращает успешный Result с значением.
 func NewOk[T any](res T) IResult[T] {

+ 6 - 6
v4/lev0/option/option.go

@@ -4,7 +4,7 @@ import (
 	"reflect"
 
 	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/defs/def_spec"
 	mH "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
@@ -27,7 +27,7 @@ func NewSome[T any](value T) mKs.IOption[T] {
 }
 
 // NewNone - нет результата в ответе.
-func NewNone[T any]() mKs.IOption[T] {
+func NewNone[T any]() def_spec.IOption[T] {
 	return &Option[T]{
 		some: nil,
 	}
@@ -67,13 +67,13 @@ func (sf *Option[T]) SomeOrFn(fn func() T) T {
 }
 
 // Hassert -- проверяет, что не пустое значение (с паникой).
-func (sf *Option[T]) Hassert(msgFormat defs.ITxtFix, args ...any) T {
-	mH.Hassert(sf.some != nil, msgFormat.Get(), args...)
+func (sf *Option[T]) Hassert(msgFormat def_spec.ATxt, args ...any) T {
+	mH.Hassert(sf.some != nil, msgFormat, args...)
 	return *sf.some
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-func (sf *Option[T]) Assert(msgFormat defs.ITxtFix, args ...any) T {
-	mH.Assert(sf.some != nil, msgFormat.Get(), args...)
+func (sf *Option[T]) Assert(msgFormat def_spec.ATxt, args ...any) T {
+	mH.Assert(sf.some != nil, msgFormat, args...)
 	return *sf.some
 }

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

@@ -3,7 +3,7 @@ package option
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 )
 
 type testerOption struct {
@@ -33,29 +33,29 @@ func (sf *testerOption) createNoneGood1() {
 			sf.t.Fatalf("createNoneGood1(): panic=%v", _panic)
 		}
 	}()
-	opt := NewNone[defs.ITxtFix]()
+	opt := NewNone[def_spec.ATxt]()
 	if opt.IsSome() {
 		sf.t.Fatalf("createNoneGood1(): is ok")
 	}
 	if !opt.IsNone() {
 		sf.t.Fatalf("createNoneGood1(): not err")
 	}
-	if val := opt.SomeOr(defs.TxtFix("test2")); val.Get() != "test2" {
+	if val := opt.SomeOr("test2"); val != "test2" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.SomeOr(defs.TxtFix("test1")); val.Get() != "test1" {
+	if val := opt.SomeOr("test1"); val != "test1" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.SomeOrFn(sf.fnWrap2); val.Get() != "test5" {
+	if val := opt.SomeOrFn(sf.fnWrap2); val != "test5" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	_opt := opt.(*Option[defs.ITxtFix])
+	_opt := opt.(*Option[def_spec.ATxt])
 	sf.unwrapErr(_opt)
 	sf.hassert(_opt)
 	sf.assert(_opt)
 }
 
-func (sf *testerOption) assert(res *Option[defs.ITxtFix]) {
+func (sf *testerOption) assert(res *Option[def_spec.ATxt]) {
 	sf.t.Log("assert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -65,9 +65,9 @@ func (sf *testerOption) assert(res *Option[defs.ITxtFix]) {
 	res.Hassert(testAssert)
 }
 
-var testAssert = defs.Txt("test assert")
+const testAssert = def_spec.ATxt("test assert")
 
-func (sf *testerOption) hassert(res *Option[defs.ITxtFix]) {
+func (sf *testerOption) hassert(res *Option[def_spec.ATxt]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -77,7 +77,7 @@ func (sf *testerOption) hassert(res *Option[defs.ITxtFix]) {
 	res.Hassert(testAssert)
 }
 
-func (sf *testerOption) unwrapErr(res *Option[defs.ITxtFix]) {
+func (sf *testerOption) unwrapErr(res *Option[def_spec.ATxt]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -88,7 +88,7 @@ func (sf *testerOption) unwrapErr(res *Option[defs.ITxtFix]) {
 }
 
 var (
-	str = defs.TxtFix("test val")
+	str = def_spec.ATxt("test val")
 )
 
 func (sf *testerOption) createSomeGood2() {
@@ -108,11 +108,11 @@ func (sf *testerOption) createSomeGood2() {
 	if val := opt.Some(); val != str {
 		sf.t.Fatalf("createSomeGood2(): val bad")
 	}
-	txtTest1 := defs.Txt("test1")
+	txtTest1 := def_spec.ATxt("test1")
 	if val := opt.SomeOr(txtTest1); val != str {
 		sf.t.Fatalf("createSomeGood2(): val bad")
 	}
-	if val := opt.SomeOr(txtTest1); val.Get() != "str" {
+	if val := opt.SomeOr(txtTest1); val != "str" {
 		sf.t.Fatalf("createSomeGood2(): val bad")
 	}
 	if val := opt.SomeOrFn(sf.fnWrap); val != str {
@@ -122,16 +122,16 @@ func (sf *testerOption) createSomeGood2() {
 	opt.Assert(txtTest)
 }
 
-var txtTest = defs.Txt("test")
+const txtTest = def_spec.ATxt("test")
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *testerOption) fnWrap2() defs.ITxtFix {
-	return defs.Txt("test5")
+func (sf *testerOption) fnWrap2() def_spec.ATxt {
+	return "test5"
 }
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *testerOption) fnWrap() defs.ITxtFix {
-	return defs.Txt("test1")
+func (sf *testerOption) fnWrap() def_spec.ATxt {
+	return "test1"
 }
 
 func (sf *testerOption) createSomeGood1() {
@@ -153,6 +153,6 @@ func (sf *testerOption) createSomeBad1() {
 			sf.t.Fatalf("createSomeBad1(): panic==nil")
 		}
 	}()
-	var str defs.ITxtFix
+	var str def_spec.ATxt
 	_ = NewSome(str)
 }

+ 0 - 6
v4/lev0/proton/neutron.go

@@ -1,6 +0,0 @@
-// package proton -- протон на основе кварка.
-package proton
-
-// Proton -- протон на основе кварка.
-type Proton struct {
-}

+ 29 - 26
v4/lev0/result/result.go

@@ -1,11 +1,11 @@
 package result
 
 import (
+	"fmt"
 	"reflect"
 	"runtime"
 
-	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/defs/def_spec"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
@@ -13,17 +13,17 @@ import (
 //
 // Может быть либо только полезное значение, либо только ошибка.
 type Result[T any] struct {
-	val     T         // Полезное значение
-	isCheck bool      // Если проверено
-	err     defs.IErr // Ошибка
+	val     T             // Полезное значение
+	isCheck bool          // Если проверено
+	err     error // Ошибка
 }
 
 var (
-	str5 = defs.ATxt("NewOk(): result==nil")
+	str5 = def_spec.ATxt("NewOk(): result==nil")
 )
 
 // NewOk -- возвращает успешный Result с значением.
-func NewOk[T any](result T) mKs.IResult[T] {
+func NewOk[T any](result T) def_spec.IResult[T] {
 	// Для некоторых типов нужна дополнительная проверка через reflect
 	v := reflect.ValueOf(result)
 	switch v.Kind() {
@@ -38,11 +38,11 @@ func NewOk[T any](result T) mKs.IResult[T] {
 }
 
 var (
-	str6 = defs.ATxt("NewErr(): err==nil")
+	str6 = def_spec.ATxt("NewErr(): err==nil")
 )
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err defs.IErr) mKs.IResult[T] {
+func NewErr[T any](err error) def_spec.IResult[T] {
 	mKh.Hassert(err != nil, str6)
 	sf := &Result[T]{
 		err: err,
@@ -52,22 +52,22 @@ func NewErr[T any](err defs.IErr) mKs.IResult[T] {
 }
 
 var (
-	str7 = defs.ATxt("WrapErr(): result not have error")
-	str8 = defs.ATxt("WrapErr(): err==nil")
+	str7 = def_spec.ATxt("WrapErr(): result not have error")
+	str8 = def_spec.ATxt("WrapErr(): err==nil")
 )
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res mKs.IResult[T], err defs.IErr) mKs.IResult[T] {
+func WrapErr[T any](res def_spec.IResult[T], err error) def_spec.IResult[T] {
 	mKh.Hassert(res.IsErr(), str7)
 	mKh.Hassert(err != nil, str8)
 	err0 := res.Err() // Чтобы не было паники при финализации и обернуть ошибку
-	err = defs.Err("%v, err=\n\t%w", err0, err)
+	err = fmt.Errorf("%v, err=\n\t%w", err0, err)
 	sf := NewErr[T](err)
 	return sf
 }
 
 var (
-	str9 = defs.ATxt("Result[T].destroy(): err not checked")
+	str9 = def_spec.ATxt("Result[T].destroy(): err not checked")
 )
 
 func (sf *Result[T]) destroy(res *Result[T]) {
@@ -106,7 +106,7 @@ func (sf *Result[T]) OkOr(defaultValue T) T {
 }
 
 var (
-	str11 = defs.ATxt("Result[T].OkOrFn(): fn==nil")
+	str11 = def_spec.ATxt("Result[T].OkOrFn(): fn==nil")
 )
 
 // OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
@@ -121,11 +121,11 @@ func (sf *Result[T]) OkOrFn(fn func() T) T {
 }
 
 var (
-	str12 = defs.ATxt("Result[T].Err(): err==nil")
+	str12 = def_spec.ATxt("Result[T].Err(): err==nil")
 )
 
 // Err -- возвращает ошибку, если она есть.
-func (sf *Result[T]) Err() defs.IErr {
+func (sf *Result[T]) Err() error {
 	mKh.Hassert(sf.err != nil, str12)
 	sf.isCheck = true
 	return sf.err
@@ -141,24 +141,27 @@ func (sf *Result[T]) Error() string {
 }
 
 // Hassert -- проверяет, что нет ошибки (с паникой).
-func (sf *Result[T]) Hassert(msgFormat defs.ITxtFix, args ...any) T {
-	strErr := defs.Txt("")
+func (sf *Result[T]) Hassert(msgFormat def_spec.ATxt, args ...any) T {
+	strErr := ""
 	if !sf.isCheck {
-		strErr = defs.Txt("Result[T].Hassert(): not check error, err=\n\t%v", sf.err)
+		strErr = fmt.Sprintf("Result[T].Hassert(): not check error, err=\n\t%v", sf.err)
+	} else {
+		strErr = fmt.Sprintf(string(msgFormat)+strErr, args...)
 	}
-	strErr = defs.Txt(msgFormat.Get()+strErr.Get(), args...)
-	mKh.Hassert(sf.err == nil, strErr.Get())
+	mKh.Hassert(sf.err == nil, def_spec.ATxt(strErr))
 	sf.isCheck = true
 	return sf.val
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-func (sf *Result[T]) Assert(msgFormat defs.ITxtFix, args ...any) T {
-	strErr := defs.Txt("")
+func (sf *Result[T]) Assert(msgFormat def_spec.ATxt, args ...any) T {
+	strErr := ""
 	if !sf.isCheck {
-		strErr = defs.Txt("Result[T].Assert(): not check error, , err=\n\t%v", sf.err)
+		strErr = fmt.Sprintf("Result[T].Assert(): not check error, , err=\n\t%v", sf.err)
+	} else {
+		strErr = fmt.Sprintf(string(msgFormat)+strErr, args...)
 	}
-	mKh.Assert(sf.err == nil, msgFormat.Get()+strErr.Get(), args...)
+	mKh.Assert(sf.err == nil, def_spec.ATxt(strErr), args...)
 	sf.isCheck = true
 	return sf.val
 }

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

@@ -1,11 +1,13 @@
 package result
 
 import (
+	"fmt"
 	"runtime"
 	"testing"
 
-	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/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
 )
 
 type tester struct {
@@ -22,7 +24,7 @@ func TestResult(t *testing.T) {
 }
 
 const (
-	str1 = defs.ATxt("test result")
+	str1 = def_spec.ATxt("test result")
 )
 
 // Создаёт новый результат и не проверяет его.
@@ -63,18 +65,18 @@ func (sf *tester) createErrGood1() {
 			sf.t.Fatalf("createErrGood1(): panic=%v", _panic)
 		}
 	}()
-	err := defs.Err("test err")
-	res := NewErr[defs.IErr](err)
+	err := fmt.Errorf("test err")
+	res := NewErr[error](err)
 	if res.IsOk() {
 		sf.t.Fatalf("createErrGood1(): is ok")
 	}
 	if !res.IsErr() {
 		sf.t.Fatalf("createErrGood1(): not err")
 	}
-	if val := res.OkOr(defs.Err("test2")); val.Get() != "test2" {
+	if val := res.OkOr(fmt.Errorf("test2")); val.Get() != "test2" {
 		sf.t.Fatalf("createErrGood1(): val bad")
 	}
-	if val := res.OkOr(defs.Err("test1")); val.Get() != "test1" {
+	if val := res.OkOr(fmt.Errorf("test1")); val.Get() != "test1" {
 		sf.t.Fatalf("createErrGood1(): val bad")
 	}
 	if val := res.OkOrFn(sf.fnWrap2); val.Get() != "test5" {
@@ -103,13 +105,13 @@ func (sf *tester) createErrGood1() {
 }
 
 var (
-	str2 = defs.Txt("test assert2")
+	str2 = def_spec.ATxt("test assert2")
 )
 
 func (sf *tester) assert2() {
 	sf.t.Log("assert2")
-	err := defs.Err("test_error")
-	res := NewErr[mKs.EBool](err)
+	err := def_err.Err("test_error")
+	res := NewErr[error](err)
 	defer func() {
 		if _panic := recover(); _panic == nil {
 			sf.t.Fatalf("assert2(): panic==nil")
@@ -119,24 +121,24 @@ func (sf *tester) assert2() {
 }
 
 var (
-	str3 = defs.Txt("test hassert2")
+	str3 = def_err.Err("test hassert2")
 )
 
-func (sf *tester) hassert2(res mKs.IResult[defs.IErr]) {
+func (sf *tester) hassert2(res def_spec.IResult[error]) {
 	sf.t.Log("hassert2")
 	defer func() {
 		if _panic := recover(); _panic == nil {
 			sf.t.Fatalf("assert(): panic==nil")
 		}
 	}()
-	_ = res.Hassert(str3)
+	_ = res.Hassert(str3.Get())
 }
 
 var (
-	str4 = defs.Txt("test assert")
+	str4 = def_spec.ATxt("test assert")
 )
 
-func (sf *tester) hassert(res mKs.IResult[defs.IErr]) {
+func (sf *tester) hassert(res def_spec.IResult[def_spec.IErr]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -146,7 +148,7 @@ func (sf *tester) hassert(res mKs.IResult[defs.IErr]) {
 	_ = res.Hassert(str4)
 }
 
-func (sf *tester) unwrapErr(res mKs.IResult[defs.IErr]) {
+func (sf *tester) unwrapErr(res def_spec.IResult[error]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -164,12 +166,12 @@ func (sf *tester) createErrBad1() {
 			sf.t.Fatalf("createErrBad1(): panic==nil")
 		}
 	}()
-	var err defs.IErr
-	_ = NewErr[mKs.EBool](err)
+	var err def_spec.IErr
+	_ = NewErr[def_spec.IErr](err)
 }
 
 var (
-	str = defs.Txt("test val")
+	str = def_spec.ATxt("test val")
 )
 
 func (sf *tester) createOkGood2() {
@@ -189,7 +191,7 @@ func (sf *tester) createOkGood2() {
 	if val := res.Ok(); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	txt1 := defs.Txt("test1")
+	txt1 := def_spec.ATxt("test1")
 	if val := res.OkOr(txt1); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
@@ -199,23 +201,23 @@ func (sf *tester) createOkGood2() {
 	if val := res.OkOrFn(sf.fnWrap); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	res0 := NewErr[any](defs.Err("test_error"))
+	res0 := NewErr[any](def_err.Err("test_error"))
 	if err := res0.Err(); err == nil {
 		sf.t.Fatalf("createOkGood1(): err==nil")
 	}
-	str1 := defs.Txt("test assert")
-	res.Hassert(str1)
-	res.Assert(str1)
+	str1 := def_txt.Txt("test assert")
+	res.Hassert(str1.Get())
+	res.Assert(str1.Get())
 }
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *tester) fnWrap2() defs.IErr {
-	return defs.Err("test5")
+func (sf *tester) fnWrap2() def_spec.IErr {
+	return def_err.Err("test5")
 }
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *tester) fnWrap() *defs.KTxt {
-	return defs.Txt("test1")
+func (sf *tester) fnWrap() def_spec.ATxt {
+	return "test1"
 }
 
 func (sf *tester) createOkGood1() {
@@ -237,6 +239,6 @@ func (sf *tester) createOkBad1() {
 			sf.t.Fatalf("createOkBad1(): panic==nil")
 		}
 	}()
-	var str defs.ITxtFix
+	var str def_spec.ITxtFix
 	_ = NewOk(str)
 }

+ 5 - 2
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go

@@ -27,8 +27,11 @@ func NewMockHandSubHttp(topic bus_ent.ITopicFix, webHook defs.ITxtFix) bus_spec.
 	mKh.Hassert(topic != nil, "NewHandlerHttpSub(): topic is empty")
 	mKh.Hassert(webHook.Get() != "", "NewHandlerHttpSub(): webHook is empty")
 	sf := &MockHandSubHttp{
-		Topic_:   topic,
-		Name_:    bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(webHook.String() + "_" + rand.Text()))),
+		Topic_: topic,
+		Name_: bus_ent.IHandlerNameFix(
+			handler_name.NewHandlerName(
+				bus_ent.AHandlerName(
+					webHook.String() + "_" + rand.Text()))),
 		WebHook_: webHook,
 	}
 	return sf

+ 5 - 4
v4/lev2/lti/bus_spec/ikernel_bus.go

@@ -3,6 +3,7 @@ package bus_spec
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -13,16 +14,16 @@ import (
 //	Подписка и обслуживание входящих запросов требует _обработчиков_.
 type IKernelBus interface {
 	// Publish -- публикует сообщение в шину
-	Publish(topic bus_ent.ITopicFix, binMsg []byte) core_spec.IResult[core_spec.EBool]
+	Publish(topic bus_ent.ITopicFix, binMsg []byte) def_spec.IResult[core_spec.EBool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic bus_ent.ITopicFix, binReq []byte) core_spec.IResult[[]byte]
+	SendRequest(topic bus_ent.ITopicFix, binReq []byte) def_spec.IResult[[]byte]
 
 	// Subscribe -- подписывает обработчик на топик
-	Subscribe(IBusHandlerSubscribe) core_spec.IResult[core_spec.EBool]
+	Subscribe(IBusHandlerSubscribe) def_spec.IResult[core_spec.EBool]
 	// Unsubscribe -- отписывается от топика
 	Unsubscribe(IBusHandlerSubscribe)
 	// RegisterServe -- Регистрирует обработчик на обслуживание входящих запросов
-	RegisterServe(IBusHandlerServe) core_spec.IResult[core_spec.EBool]
+	RegisterServe(IBusHandlerServe) def_spec.IResult[core_spec.EBool]
 
 	// IsWork -- возвращает признак работы шины
 	IsWork() core_spec.EBool

+ 2 - 2
v4/lev2/lti/dot/msg_pub/msg_pub_test.go

@@ -24,7 +24,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &PublishResp{
-		Status_: defs.Txt("test_ok"),
+		Status_: defs.TxtFix("test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -51,7 +51,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &PublishReq{
 		Topic_:  qName,
-		Uuid_:   defs.Txt("test_uuid"),
+		Uuid_:   defs.TxtFix("test_uuid"),
 		BinMsg_: []byte("test msg"),
 	}
 	req.SelfCheck()

+ 2 - 2
v4/lev2/lti/dot/msg_serve/msg_serve_test.go

@@ -24,7 +24,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &ServeResp{
-		Status_: defs.Txt("test_ok"),
+		Status_: defs.TxtFix("test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -51,7 +51,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &ServeReq{
 		Topic_:  qName,
-		Uuid_:   defs.Txt("test_uuid"),
+		Uuid_:   defs.TxtFix("test_uuid"),
 		BinReq_: []byte("test msg"),
 	}
 	req.SelfCheck()

+ 3 - 3
v4/lev2/lti/dot/msg_sub/msg_sub_test.go

@@ -24,7 +24,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &SubscribeResp{
-		Status_: defs.Txt("test_ok"),
+		Status_: defs.TxtFix("test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -51,8 +51,8 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &SubscribeReq{
 		Topic_:   qName,
-		Uuid_:    defs.Txt("test_uuid"),
-		WebHook_: defs.Txt("test msg"),
+		Uuid_:    defs.TxtFix("test_uuid"),
+		WebHook_: defs.TxtFix("test msg"),
 	}
 	req.SelfCheck()
 }

+ 2 - 2
v4/lev2/lti/dot/msg_unsub/msg_unsub_test.go

@@ -24,7 +24,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &UnsubResp{
-		Status_: defs.Txt("test_ok"),
+		Status_: defs.TxtFix("test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -47,7 +47,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &UnsubReq{
 		HandlerName_: bus_ent.AHandlerName("test_topic"),
-		Uuid_:        defs.Txt("test_uuid"),
+		Uuid_:        defs.TxtFix("test_uuid"),
 	}
 	req.SelfCheck()
 }

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

@@ -7,6 +7,7 @@ import (
 	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/def_spec"
 	"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"
@@ -21,7 +22,7 @@ import (
 )
 
 var (
-	busBaseStreamName = stream_name.NewAStreamName(defs.Txt("bus_base"))
+	busBaseStreamName = stream_name.NewAStreamName(defs.TxtFix("bus_base"))
 )
 
 // KBusBase -- базовая часть шины данных.
@@ -60,7 +61,7 @@ func GetKernelBusBase() *KBusBase {
 	go Bus_.run()
 	Bus_.IsWork_.Set()
 	Bus_.KCtx_.Wg().Add(busBaseStreamName)
-	Bus_.KCtx_.Set(defs.Txt("kernBusBase"), Bus_, "base of data bus")
+	Bus_.KCtx_.Set(defs.TxtFix("kernBusBase"), Bus_, "base of data bus")
 	_ = bus_spec.IKernelBus(Bus_)
 	return Bus_
 }
@@ -71,7 +72,7 @@ func (sf *KBusBase) Log() comp_spec.ILogBuf {
 }
 
 func (sf *KBusBase) run() {
-	sf.log.Debug(defs.Txt("KBusBase.run()"))
+	sf.log.Debug(defs.TxtFix("KBusBase.run()"))
 	for {
 		break
 	}
@@ -79,14 +80,16 @@ func (sf *KBusBase) run() {
 
 // Unsubscribe -- отписывает обработчик от топика.
 func (sf *KBusBase) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
-	msg := defs.Txt("KBusBase.Unsubscribe(): handler='%v'", handler.Name())
+	msg := defs.TxtFix("KBusBase.Unsubscribe(): handler='%v'",
+		handler.Name())
 	sf.log.Debug(msg)
 	sf.dictSub.Unsubscribe(handler)
 }
 
 // Subscribe -- подписывает обработчик на топик.
-func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) core_spec.IResult[core_spec.EBool] {
-	msg := defs.Txt("KBusBase.Subscribe(): handler='%v'", handler.Name())
+func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) def_spec.IResult[core_spec.EBool] {
+	msg := defs.TxtFix("KBusBase.Subscribe(): handler='%v'",
+		handler.Name())
 	sf.log.Debug(msg)
 	helpers.Hassert(!sf.IsWork_.Get(), "KBusBase.Subscribe():  handler='%v', bus already closed", []any{handler.Name()})
 	sf.dictSub.Subscribe(handler)
@@ -95,7 +98,7 @@ func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) core_spec.I
 
 // SendRequest -- отправляет запрос в шину данных.
 func (sf *KBusBase) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IResult[[]byte] {
-	msg := defs.Txt("KBusBase.SendRequest(): topic='%v'", topic.Get())
+	msg := defs.TxtFix("KBusBase.SendRequest(): topic='%v'", topic.Get())
 	sf.log.Debug(msg)
 	if !sf.IsWork_.Get() {
 		err := defs.Err("KBusBase.SendRequest():  topic='%v', bus already closed", topic.Get())
@@ -117,7 +120,7 @@ func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult
 		err := defs.Err("KBusBase.RegisterServe(): IBusHandlerServe==nil")
 		return mL0.NewErr[core_spec.EBool](err)
 	}
-	msg := defs.Txt("KBusBase.RegisterServe(): handler='%v'", handler.Name())
+	msg := defs.TxtFix("KBusBase.RegisterServe(): handler='%v'", handler.Name())
 	sf.log.Debug(msg)
 	res := sf.dictServe.Register(handler)
 	if res.IsErr() {
@@ -130,7 +133,7 @@ func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult
 
 // Publish -- публикует сообщение в шину.
 func (sf *KBusBase) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IResult[core_spec.EBool] {
-	msg := defs.Txt("KBusBase.Publish(): topic='%v'", topic)
+	msg := defs.TxtFix("KBusBase.Publish(): topic='%v'", topic)
 	sf.log.Debug(msg)
 	if !sf.IsWork_.Get() {
 		err := defs.Err("KBusBase.Publish(): topic='%v',bus already closed", topic)
@@ -157,5 +160,5 @@ func (sf *KBusBase) close() {
 	}
 	sf.IsWork_.Reset()
 	sf.KCtx_.Wg().Done(busBaseStreamName)
-	sf.log.Debug(defs.Txt("KBusBase.close(): done"))
+	sf.log.Debug(defs.TxtFix("KBusBase.close(): done"))
 }

+ 5 - 3
v4/lev2/lti/kbus_base/kbus_base_test.go

@@ -27,8 +27,10 @@ var (
 func TestKernelBusLocal(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, defs.Txt("mock_hand_sub")),
-		handServ: mock_hand_serve.NewMockHandlerServe(qNameServe, "mock_hand_serv"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub,
+			defs.TxtFix("mock_hand_sub")),
+		handServ: mock_hand_serve.NewMockHandlerServe(qNameServe,
+			"mock_hand_serv"),
 	}
 	sf.new()
 	sf.subBad1()
@@ -78,7 +80,7 @@ func (sf *tester) reqGood1() {
 
 func (sf *tester) servGood1() {
 	sf.t.Log("servGood1")
-	sf.kBus.RegisterServe(sf.handServ).Hassert(defs.Txt("servGood1()"))
+	sf.kBus.RegisterServe(sf.handServ).Hassert("servGood1()")
 }
 
 // Нет обработчика для обслуживания запросов.

+ 16 - 14
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -12,6 +12,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/defs/def_spec"
 	"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"
@@ -40,14 +41,15 @@ type ClientBusHttp struct {
 func NewClientBusHttp(urlRemote defs.ITxtFix) bus_spec.IBusClient {
 	param := &log_buf.LogBufParam{
 		IsTerm_: safe_bool.NewSafeBool(true),
-		Prefix_: defs.Txt("ClientBusHttp"),
+		Prefix_: defs.TxtFix("ClientBusHttp"),
 	}
 	log := mL1.NewLogBuf(param)
-	log.Debug(defs.Txt("NewClientBusHttp()"))
+	log.Debug(defs.TxtFix("NewClientBusHttp()"))
 	helpers.Hassert(urlRemote != nil, "NewClientBusHttp(): urlRemote is empty", []any{})
 	kCtx := kctx.GetKernelCtx()
-	resLocal := safe_string.NewSafeStringGetenv(defs.Txt("LOCAL_HTTP_URL"))
-	resLocal.Hassert(defs.Txt("NewClientBusHttp(): in get env LOCAL_HTTP_URL)"))
+	resLocal := safe_string.NewSafeStringGetenv(
+		defs.TxtFix("LOCAL_HTTP_URL"))
+	resLocal.Hassert("NewClientBusHttp(): in get env LOCAL_HTTP_URL)")
 	urlLocal := resLocal.Ok()
 	kBusHttp := kbus_http.GetKernelBusHttp()
 	sf := &ClientBusHttp{
@@ -68,7 +70,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 
 	req := &dot.UnsubReq{
 		HandlerName_: handler.Name().Get(),
-		Uuid_:        defs.Txt(_uuid.String()),
+		Uuid_:        defs.TxtFix(_uuid.String()),
 	}
 	req.SelfCheck()
 	binReq, err := json.MarshalIndent(req, "", "  ")
@@ -101,18 +103,18 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывается на топик в дистанционной шине.
-func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IResult[mKs.EBool] {
+func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) def_spec.IResult[mKs.EBool] {
 	_uuid, err := uuid.NewV6()
 	helpers.Hassert(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", []any{err})
 	req := &dot.SubscribeReq{
 		Topic_:   handler.Topic().Get(),
-		Uuid_:    defs.Txt(_uuid.String()),
-		WebHook_: defs.Txt("%v%v", sf.urlLocal.String()+"/bus/pub"), // Веб-хук всегда на своей стороне
+		Uuid_:    defs.TxtFix(_uuid.String()),
+		WebHook_: defs.TxtFix("%v%v", sf.urlLocal.String()+"/bus/pub"), // Веб-хук всегда на своей стороне
 	}
 	req.SelfCheck()
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	endPoint := defs.Txt("%v%v", sf.urlLocal.String()+"/bus/sub")
+	endPoint := defs.TxtFix("%v%v", sf.urlLocal.String()+"/bus/sub")
 	hReq, err := http.NewRequest(http.MethodPost, endPoint.String(), body)
 	helpers.Hassert(err != nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v", []any{})
 
@@ -145,13 +147,13 @@ 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_:   defs.Txt(_uuid.String()),
+		Uuid_:   defs.TxtFix(_uuid.String()),
 		BinReq_: binReq,
 	}
 	req.SelfCheck()
 	_binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(_binReq))
-	endPont := defs.Txt("%v%v", sf.urlRemote.String(), "/bus/request")
+	endPont := defs.TxtFix("%v%v", sf.urlRemote.String(), "/bus/request")
 	hReq, err := http.NewRequest(http.MethodPost, endPont.String(), body)
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
 
@@ -197,13 +199,13 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
 	req := &dot.PublishReq{
 		Topic_:  topic.Get(),
-		Uuid_:   defs.Txt(_uuid.String()),
+		Uuid_:   defs.TxtFix(_uuid.String()),
 		BinMsg_: binMsg,
 	}
 	req.SelfCheck()
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	endPoint := defs.Txt("%v%v", sf.urlRemote.Get(), "/bus/pub")
+	endPoint := defs.TxtFix("%v%v", sf.urlRemote.Get(), "/bus/pub")
 	hReq, err := http.NewRequest(http.MethodPost, endPoint.String(), body)
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
 
@@ -230,7 +232,7 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 }
 
 // Единый обработчик запросов.
-func (sf *ClientBusHttp) makePost(hReq *http.Request) mKs.IResult[[]byte] {
+func (sf *ClientBusHttp) makePost(hReq *http.Request) def_spec.IResult[[]byte] {
 	hReq.Header.Add("Content-Type", "application/json")
 	_resp, err := http.DefaultClient.Do(hReq)
 	if err != nil {

+ 7 - 7
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go

@@ -21,8 +21,8 @@ import (
 )
 
 var (
-	baseUrl   = defs.Txt("http://127.0.0.1:18350/")
-	pathStore = defs.Txt("/store/store_client_bus_http")
+	baseUrl   = defs.TxtFix("http://127.0.0.1:18350/")
+	pathStore = defs.TxtFix("/store/store_client_bus_http")
 )
 
 type tester struct {
@@ -97,7 +97,7 @@ func (sf *tester) sendGood1() {
 }
 
 var (
-	strTraTaTa = defs.Txt("tra-ta-ta")
+	strTraTaTa = defs.TxtFix("tra-ta-ta")
 )
 
 // Левый адрес.
@@ -137,7 +137,7 @@ func (sf *tester) reg() {
 func (sf *tester) regGood1() {
 	sf.t.Log("regGood1")
 	res := sf.cl.RegisterServe(sf.handServ)
-	res.Hassert(defs.Txt("regGood1()"))
+	res.Hassert("regGood1()")
 }
 
 // Нет серверного обработчика.
@@ -391,7 +391,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.kCtx.Set(defs.Txt("monolitName"), "test_client_bus_http", "comment")
+	sf.kCtx.Set(defs.TxtFix("monolitName"), "test_client_bus_http", "comment")
 	sf.cl = NewClientBusHttp(baseUrl).(*ClientBusHttp)
 	kServHttp := kserv_http.GetKernelServHttp()
 	kServHttp.Run()
@@ -407,11 +407,11 @@ func (sf *tester) newGood1() {
 // Пустой URL.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2")
-	_ = NewClientBusHttp(defs.Txt(""))
+	_ = NewClientBusHttp(defs.TxtFix(""))
 }
 
 // Нет ничего для HTTP-шины.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	_ = NewClientBusHttp(defs.Txt("url"))
+	_ = NewClientBusHttp(defs.TxtFix("url"))
 }

+ 41 - 35
v4/lev2/lti/kbus_http/kbus_http.go

@@ -41,10 +41,10 @@ func GetKernelBusHttp() bus_spec.IKernelBus {
 	}
 	paramLogBuf := &mL1.LogBufParam{
 		IsTerm_: safe_bool.NewSafeBool(true),
-		Prefix_: defs.Txt("kBusHttp"),
+		Prefix_: defs.TxtFix("kBusHttp"),
 	}
 	log := mL1.NewLogBuf(paramLogBuf)
-	log.Debug(defs.Txt("GetKernelBusHttp(): new"))
+	log.Debug(defs.TxtFix("GetKernelBusHttp(): new"))
 	kCtx := kctx.GetKernelCtx()
 	kBus := kbus_base.GetKernelBusBase()
 	sf := &kBusHttp{
@@ -57,23 +57,24 @@ func GetKernelBusHttp() bus_spec.IKernelBus {
 	fibApp.Post("/bus/unsub", sf.postUnsub)         // Топик отписки, IN
 	fibApp.Post("/bus/request", sf.postSendRequest) // Топик входящих запросов, IN
 	fibApp.Post("/bus/pub", sf.postPublish)         // Топик публикаций подписки, IN
-	kCtx.Set(defs.Txt("kernBus"), sf, "GetKernelBusHttp(): http data bus")
+	kCtx.Set(defs.TxtFix("kernBus"), sf,
+		"GetKernelBusHttp(): http data bus")
 	Bus_ = sf
 	return Bus_
 }
 
 // Входящий запрос HTTP на подписку.
 func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
-	sf.log.Debug(defs.Txt("postSub()"))
+	sf.log.Debug(defs.TxtFix("postSub()"))
 	ctx.Set("Content-type", "text/html; charset=utf8")
 	ctx.Set("Content-type", "text/json")
 	ctx.Set("Cache-Control", "no-cache")
-	sf.log.Debug(defs.Txt("postSub()"))
+	sf.log.Debug(defs.TxtFix("postSub()"))
 	req := &dot.SubscribeReq{}
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.SubscribeResp{
-			Status_: defs.Txt("kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
+			Status_: defs.TxtFix("kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
@@ -93,13 +94,15 @@ func (sf *kBusHttp) processSubscribe(req *dot.SubscribeReq) *dot.SubscribeResp {
 	topic := bus_ent.ITopicFix(topic.NewTopic(req.Topic_))
 	handler := mock_hand_sub_http.NewMockHandSubHttp(topic, req.WebHook_)
 	resp := &dot.SubscribeResp{
-		Status_: defs.Txt("ok"),
+		Status_: defs.TxtFix("ok"),
 		Uuid_:   req.Uuid_,
 		Name_:   handler.Name().Get(),
 	}
 	res := sf.Subscribe(handler)
 	if res.IsErr() {
-		resp.Status_ = defs.Txt("kernelBusHttp.processSubscribe(): err=\n\t%v", res.Err())
+		resp.Status_ = defs.TxtFix(
+			"kernelBusHttp.processSubscribe(): err=\n\t%v",
+			res.Err())
 		return resp
 	}
 	return resp
@@ -108,9 +111,7 @@ func (sf *kBusHttp) processSubscribe(req *dot.SubscribeReq) *dot.SubscribeResp {
 // Входящая публикация.
 func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 	sf.log.Debug(defs.Txt("postPublish()"))
-	ctx.Set("Content-type", "text/html; charset=utf8")
-	ctx.Set("Content-type", "text/json")
-	ctx.Set("Cache-Control", "no-cache")
+	sf.postCommon(ctx)
 	req := &dot.PublishReq{}
 	err := ctx.Bind().Body(req)
 	if err != nil {
@@ -129,6 +130,35 @@ func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 	return ctx.JSON(resp)
 }
 
+// Входящая отписка от топика по HTTP.
+func (sf *kBusHttp) postUnsub(ctx fiber.Ctx) error {
+	sf.log.Debug(defs.Txt("postUnsub()"))
+	sf.postCommon(ctx)
+	req := &dot.UnsubReq{}
+	err := ctx.Bind().Body(req)
+	if err != nil {
+		resp := &dot.ServeResp{
+			Status_: defs.Txt("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
+			Uuid_:   req.Uuid_,
+		}
+		resp.SelfCheck()
+		ctx.Response().SetStatusCode(http.StatusBadRequest)
+		err := defs.Err("kBusHttp.postUnsub(): in body parser, status=%q", resp.Status_)
+		sf.log.Err(err)
+		return ctx.JSON(resp)
+	}
+	resp := sf.processUnsubRequest(req)
+	resp.SelfCheck()
+	return ctx.JSON(resp)
+}
+
+// Общая часть процесса публикации и отписки.
+func (sf *kBusHttp) postCommon(ctx fiber.Ctx) {
+	ctx.Set("Content-type", "text/html; charset=utf8")
+	ctx.Set("Content-type", "text/json")
+	ctx.Set("Cache-Control", "no-cache")
+}
+
 // Выполняет процесс публикации.
 func (sf *kBusHttp) processPublish(req *dot.PublishReq) *dot.PublishResp {
 	req.SelfCheck()
@@ -186,30 +216,6 @@ func (sf *kBusHttp) processSendRequest(req *dot.ServeReq) *dot.ServeResp {
 	return resp
 }
 
-// Входящая отписка от топика по HTTP.
-func (sf *kBusHttp) postUnsub(ctx fiber.Ctx) error {
-	sf.log.Debug(defs.Txt("postUnsub()"))
-	ctx.Set("Content-type", "text/html; charset=utf8")
-	ctx.Set("Content-type", "text/json")
-	ctx.Set("Cache-Control", "no-cache")
-	req := &dot.UnsubReq{}
-	err := ctx.Bind().Body(req)
-	if err != nil {
-		resp := &dot.ServeResp{
-			Status_: defs.Txt("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
-			Uuid_:   req.Uuid_,
-		}
-		resp.SelfCheck()
-		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		err := defs.Err("kBusHttp.postUnsub(): in body parser, status=%q", resp.Status_)
-		sf.log.Err(err)
-		return ctx.JSON(resp)
-	}
-	resp := sf.processUnsubRequest(req)
-	resp.SelfCheck()
-	return ctx.JSON(resp)
-}
-
 // Процесс отписки от топика.
 func (sf *kBusHttp) processUnsubRequest(req *dot.UnsubReq) *dot.UnsubResp {
 	req.SelfCheck()

+ 2 - 1
v4/lev2/lti/kbus_http/kbus_http_test.go

@@ -38,7 +38,8 @@ var (
 func TestKernelBusHttp(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, defs.Txt("http://localhost:18200/bus/pub")),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub,
+			defs.TxtFix("http://localhost:18200/bus/pub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qNameServ, "name_serv"),
 	}
 	ctx := kctx.GetKernelCtx()

+ 7 - 12
v4/lev3/mod_ent/mod_num/mod_num.go

@@ -12,14 +12,13 @@ import (
 )
 
 // AModNum -- номер модуля.
-type AModNum int
+type AModNum defs.Int
 
 // IModNumFix -- фиксированный модуль номера.
 type IModNumFix interface {
+	defs.IString
 	// Get -- получить номер модуля
 	Get() AModNum
-	// String -- строковое представление номера модуля
-	String() string
 }
 
 // moduleNum -- номер модуля.
@@ -44,10 +43,10 @@ func NewModuleNumFix() IModNumFix {
 }
 
 // FromStr -- возвращает новый номер модуля из строки.
-func FromStr(strNumMod string) core_spec.IResult[IModNumFix] {
-	iNum, err := strconv.Atoi(strNumMod)
+func FromStr(txtNumMod defs.ITxtFix) core_spec.IResult[IModNumFix] {
+	iNum, err := txtNumMod.Atoi()
 	if err != nil {
-		err := defs.Err("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", strNumMod, err)
+		err := defs.Err("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", txtNumMod, err)
 		return lev0.NewErr[IModNumFix](err)
 	}
 	sf := &moduleNum{
@@ -56,16 +55,12 @@ func FromStr(strNumMod string) core_spec.IResult[IModNumFix] {
 	return lev0.NewOk(IModNumFix(sf))
 }
 
-// Get -- получить номер модуля
-//
-
+// Get -- получить номер модуля.
 func (sf *moduleNum) Get() AModNum {
 	return sf.num
 }
 
-// String -- строковое представление номера модуля
-//
-
+// String -- строковое представление номера модуля.
 func (sf *moduleNum) String() string {
 	return fmt.Sprint(sf.num)
 }