Explorar el Código

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

SVI hace 4 meses
padre
commit
4dd4fc34c1

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

@@ -1,16 +1,18 @@
 package core_spec
 
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+
 // EStr -- расширенная строка.
 type EStr interface {
 	// SelfCheck -- выполняет самопроверку строки.
 	SelfCheck()
 	// Get -- возвращает строку.
-	Get() string
+	Get() defs.Str
 }
 
 // EStrMut -- мутабельная расширенная строка.
 type EStrMut interface {
 	EStr
 	// Set -- устанавливает строку.
-	Set(string)
+	Set(defs.Str)
 }

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

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

+ 59 - 4
v4/lev0/defs/defs.go

@@ -1,9 +1,9 @@
 // package defs -- предметные типы ядра.
 package defs
 
-import (
-	// "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
-)
+import "fmt"
+
+// "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 
 // Int -- алиас для int.
 type Int int
@@ -13,14 +13,69 @@ func (i Int) Int() int {
 	return int(i)
 }
 
+// IStr --интерфейс к гибкой строке
+type IStr interface {
+	// Str -- возвращает внутреннюю строку
+	Str() Str
+	// String -- возвращает прямую строку
+	String()string
+}
+
 // Str -- алиас для string.
 type Str string
 
+// NewStr -- создать новую строку.
+func NewStr(msg string, arg ...any) IStr {
+	return Str(fmt.Sprintf(msg, arg...))
+}
+
+// Str -- возвращает внутреннюю строку.
+func (s Str) Str() Str {
+	return s
+}
+
 // String -- возвращает строку по требованию.
 func (s Str) String() string {
 	return string(s)
 }
 
+// IErr -- алиас для error.
+type IErr interface {
+	error
+	IStr
+}
+
+// Err -- обёрнутая ошибка.
+type Err struct {
+	err error
+}
+
+// NewErr -- создать новую обёрнутую ошибку.
+func NewErr(msg Str, arg ...any) IErr {
+	err := fmt.Errorf(msg.String(), arg...)
+	return &Err{err}
+}
+
+// WrapErr -- возвращает обёрнутую ошибку.
+func WrapErr(err error) IErr {
+	return &Err{err}
+}
+
+// String -- возвращает строковое представление ошибки.
+func (e *Err) String() string {
+	return e.err.Error()
+}
+
+// Error -- возвращает хранимую ошибку.
+func (e *Err) Error() string {
+	return e.err.Error()
+}
+
+// Str -- возвращает строку по требованию для ошибки.
+func (e *Err) Str() Str {
+	return Str(e.err.Error())
+}
+
 // Time -- метка времени.
 // Вывод: "2006-01-02 15:04:05.000 -07 MST".
 type Time Str
@@ -37,5 +92,5 @@ type BucketName Str
 //
 //go:fix inline
 // func NewStreamName(val Str) *stream_name.AStreamName {
-// 	return stream_name.NewAStreamName(string(val))
+// 	return stream_name.NewAStreamName(val)
 // }

+ 7 - 8
v4/lev0/defs/stream_name/stream_name.go

@@ -1,21 +1,20 @@
 package stream_name
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_str"
 )
 
 // AStreamName -- имя потока для ожидания.
 type AStreamName struct {
-	val *quark.QStr[quark.Fix]
+	val defs.Str
 }
 
 // NewAStreamName -- создать новое имя потока.
-func NewAStreamName(val string) *AStreamName {
+func NewAStreamName(val defs.Str) *AStreamName {
 	helpers.Hassert(val != "", "NewAStreamName(): val is empty")
 	sf := &AStreamName{
-		val: quark_str.NewQStr(val),
+		val: val,
 	}
 	return sf
 }
@@ -24,10 +23,10 @@ func NewAStreamName(val string) *AStreamName {
 //
 //go:fix inline
 func (sf *AStreamName) String() string {
-	return sf.val.Get()
+	return sf.val.String()
 }
 
 // Get -- получить значение.
-func (sf *AStreamName) Get() string {
-	return sf.val.Get()
+func (sf *AStreamName) Get() defs.Str {
+	return sf.val
 }

+ 11 - 10
v4/lev0/etypes/estr/estr.go

@@ -3,14 +3,15 @@ package estr
 
 import (
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mHp "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
 // EStr -- расширенная строка.
 type EStr struct {
-	val    string // Хранимое значение
-	lenMin int    // Минимальная длина строки
-	lenMax int    // Максимальная длина строки
+	val    defs.Str // Хранимое значение
+	lenMin defs.Int    // Минимальная длина строки
+	lenMax defs.Int    // Максимальная длина строки
 	isMut  bool   // Признак мутабельности
 }
 
@@ -18,7 +19,7 @@ type EStr struct {
 type FnOptStr func(*EStr)
 
 // OptStrMinLen -- устанавливает минимальную длину строки.
-func OptStrMinLen(lenMin int) FnOptStr {
+func OptStrMinLen(lenMin defs.Int) FnOptStr {
 	mHp.Hassert(lenMin >= 0,
 		"EStr.OptStrMinLen: минимальная длина строки должна быть больше или равна0")
 	return func(sf *EStr) {
@@ -27,7 +28,7 @@ func OptStrMinLen(lenMin int) FnOptStr {
 }
 
 // OptStrMaxLen -- устанавливает максимальную длину строки.
-func OptStrMaxLen(lenMax int) FnOptStr {
+func OptStrMaxLen(lenMax defs.Int) FnOptStr {
 	return func(sf *EStr) {
 		mHp.Hassert(lenMax >= sf.lenMin,
 			"EStr.OptStrMaxLen: максимальная длина строки должна быть больше или равна0")
@@ -36,7 +37,7 @@ func OptStrMaxLen(lenMax int) FnOptStr {
 }
 
 // OptStr -- устанавливает начальное значение строки.
-func OptStr(val string) FnOptStr {
+func OptStr(val defs.Str) FnOptStr {
 	return func(sf *EStr) {
 		sf.val = val
 	}
@@ -77,7 +78,7 @@ func NewStrMut(opt ...FnOptStr) mKs.EStrMut {
 }
 
 // Set -- устанавливает значение расширенной строки.
-func (sf *EStr) Set(val string) {
+func (sf *EStr) Set(val defs.Str) {
 	mHp.Hassert(sf.isMut,
 		"EStrMut.Set(): нельзя изменить значение расширенной строки, если она не мутабельна, val=%q", val)
 	sf.val = val
@@ -86,11 +87,11 @@ func (sf *EStr) Set(val string) {
 
 // SelfCheck -- самопроверка расширенной строки.
 func (sf *EStr) SelfCheck() {
-	mHp.Hassert(len(sf.val) < sf.lenMin, "EStr.SelfCheck(): строка не может быть %v", sf.lenMin)
-	mHp.Hassert(len(sf.val) > sf.lenMax, "EStr.SelfCheck(): строка не может быть длиннее %v", sf.lenMax)
+	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)
 }
 
 // Get -- возвращает хранимое значение расширенной строки.
-func (sf *EStr) Get() string {
+func (sf *EStr) Get() defs.Str {
 	return sf.val
 }

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

@@ -3,6 +3,7 @@ package etypes
 
 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/etypes/estr"
 )
 
@@ -16,17 +17,17 @@ type EStrMut = mKs.EStrMut
 type FnOptStr = estr.FnOptStr
 
 // OptStrMinLen -- устанавливает минимальную длину строки.
-func OptStrMinLen(lenMin int) FnOptStr {
+func OptStrMinLen(lenMin defs.Int) FnOptStr {
 	return estr.OptStrMinLen(lenMin)
 }
 
 // OptStrMaxLen -- устанавливает максимальную длину строки.
-func OptStrMaxLen(lenMax int) FnOptStr {
+func OptStrMaxLen(lenMax defs.Int) FnOptStr {
 	return estr.OptStrMaxLen(lenMax)
 }
 
 // OptStr -- устанавливает начальное значение строки.
-func OptStr(val string) FnOptStr {
+func OptStr(val defs.Str) FnOptStr {
 	return estr.OptStr(val)
 }
 

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

@@ -19,7 +19,7 @@ var (
 
 // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
 //
-//	(isCond bool, msgFormat string, args ...any)
+//	(isCond bool, msgFormat defs.Str, args ...any)
 type FnAssert func(isCond bool, msgFormat defs.Str, args ...any)
 
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).

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

@@ -2,6 +2,7 @@
 package quark
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_str"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 )
@@ -18,13 +19,13 @@ type CMod = quark_val.CMod
 type QStr[M CMod] = quark_str.QStr[M]
 
 // NewQStr -- создает новый экземпляр QStr.
-func NewQStr(val string) *QStr[Fix] {
+func NewQStr(val defs.Str) *QStr[Fix] {
 	val_ := quark_str.NewQStr(val)
 	return val_
 }
 
 // NewQStrMut -- создает новый экземпляр QStrMut.
-func NewQStrMut(val string) *QStr[Mut] {
+func NewQStrMut(val defs.Str) *QStr[Mut] {
 	val_ := quark_str.NewQStrMut(val)
 	return val_
 }

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

@@ -2,18 +2,19 @@
 package quark_str
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 )
 
 // QStr -- кварк строки.
 type QStr[M quark_val.CMod] struct {
-	*quark_base.QBase[M, string]
+	*quark_base.QBase[M, defs.Str]
 }
 
 // NewQStr -- создает фиксированную новую кварк строку.
-func NewQStr(val string) *QStr[quark_val.Fix] {
-	optMass := quark_base.QBaseOptMass[quark_val.Fix, string](len(val))
+func NewQStr(val defs.Str) *QStr[quark_val.Fix] {
+	optMass := quark_base.QBaseOptMass[quark_val.Fix, defs.Str](len(val))
 	optVal := quark_base.QBaseOptVal(val)
 	sf := &QStr[quark_val.Fix]{
 		QBase: quark_base.NewQBase(optMass, optVal),
@@ -22,8 +23,8 @@ func NewQStr(val string) *QStr[quark_val.Fix] {
 }
 
 // NewQStrMut -- создает мутабельную новую кварк строку.
-func NewQStrMut(val string) *QStr[quark_val.Mut] {
-	optMass := quark_base.QBaseOptMass[quark_val.Mut, string](len(val))
+func NewQStrMut(val defs.Str) *QStr[quark_val.Mut] {
+	optMass := quark_base.QBaseOptMass[quark_val.Mut, defs.Str](len(val))
 	optVal := quark_base.QBaseOptValMut(val)
 	sf := &QStr[quark_val.Mut]{
 		QBase: quark_base.NewQBaseMut(optMass, optVal),
@@ -34,13 +35,13 @@ func NewQStrMut(val string) *QStr[quark_val.Mut] {
 // Get -- возвращает хранимое значение.
 //
 //go:fix inline
-func (sf *QStr[M]) Get() string {
+func (sf *QStr[M]) Get() defs.Str {
 	return sf.Val().Get()
 }
 
 // Set -- устанавливает хранимое значение.
 //
 //go:fix inline
-func Set(sf *QStr[quark_val.Mut], val string) {
+func Set(sf *QStr[quark_val.Mut], val defs.Str) {
 	quark_val.Set(sf.Val(), val)
 }

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

@@ -5,6 +5,7 @@ import (
 	"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/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 )
@@ -13,7 +14,7 @@ import (
 type ICtxValue interface {
 	core_spec.IRWMutex
 	// Key -- возвращает ключ значения
-	Key() string
+	Key() defs.Str
 	// Val -- возвращает хранимое значение
 	Val() any
 	// CreateAt -- возвращает метку времени создания
@@ -21,21 +22,21 @@ type ICtxValue interface {
 	// UpdateAt -- возвращает метку времени обновления
 	UpdateAt() core_spec.ITimeMut
 	// Comment -- возвращает комментарий значения
-	Comment() string
+	Comment() defs.Str
 }
 
 // CtxValue -- потокобезопасное значение локального контекста.
 type CtxValue struct {
 	sync.RWMutex
-	key       string
+	key       defs.Str
 	createAt  core_spec.ITime
 	Val_      any
 	UpdateAt_ core_spec.ITimeMut
-	Comment_  string
+	Comment_  defs.Str
 }
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
-func NewCtxValue(key string, val any, comment string) ICtxValue {
+func NewCtxValue(key defs.Str, val any, comment defs.Str) ICtxValue {
 	helpers.Hassert(key != "", "NewCtxValue(): key is empty", []any{})
 	sf := &CtxValue{
 		key:       key,

+ 14 - 10
v4/lev1/local_ctx/local_ctx.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/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
@@ -46,7 +47,7 @@ type LocalCtx struct {
 	ctx      context.Context // Отменяемый контекст
 	fnCancel func()          // Функция отмены контекста
 
-	dictVal map[string]comp_spec.ICtxValue // Словарь различных значений
+	dictVal map[defs.Str]comp_spec.ICtxValue // Словарь различных значений
 	lstSort *lst_sort.LstSort              // Сортированный список значений
 	log     comp_spec.ILogBuf              // Локальный буфер
 }
@@ -62,7 +63,7 @@ func NewLocalCtx(ctx context.Context) ILocalCtx {
 	sf := &LocalCtx{
 		ctx:      _ctx,
 		fnCancel: fnCancel,
-		dictVal:  map[string]comp_spec.ICtxValue{},
+		dictVal:  map[defs.Str]comp_spec.ICtxValue{},
 		lstSort:  lst_sort.NewLstSort(),
 		log:      log_buf.NewLogBuf(paramLogBuf),
 	}
@@ -75,10 +76,10 @@ func (sf *LocalCtx) Ctx() context.Context {
 }
 
 // Size -- возвращает размер контекста.
-func (sf *LocalCtx) Size() int {
+func (sf *LocalCtx) Size() defs.Int {
 	sf.RLock()
 	defer sf.RUnlock()
-	return len(sf.dictVal)
+	return defs.Int(len(sf.dictVal))
 }
 
 // SortedList -- возвращает сортированный список значений.
@@ -92,13 +93,14 @@ func (sf *LocalCtx) Log() comp_spec.ILogBuf {
 }
 
 // Get -- возвращает хранимое значение.
-func (sf *LocalCtx) Get(key string) mL0.IOption[comp_spec.ICtxValue] {
+func (sf *LocalCtx) Get(key defs.Str) mL0.IOption[comp_spec.ICtxValue] {
 	sf.RLock()
 	defer sf.RUnlock()
 	if key == "" {
 		return mL0.NewNone[comp_spec.ICtxValue]()
 	}
-	sf.log.Debug("Get(): key='%v'", key)
+	msg:=defs.NewStr("Get(): key='%v'", key)
+	sf.log.Debug(msg)
 	val, isOk := sf.dictVal[key]
 	if !isOk {
 		return mL0.NewNone[comp_spec.ICtxValue]()
@@ -107,20 +109,22 @@ func (sf *LocalCtx) Get(key string) mL0.IOption[comp_spec.ICtxValue] {
 }
 
 // Del -- удаляет значение из контекста.
-func (sf *LocalCtx) Del(key string) {
+func (sf *LocalCtx) Del(key defs.Str) {
 	sf.Lock()
 	defer sf.Unlock()
-	sf.log.Debug("Del(): key='%v'", key)
+	msg:=defs.NewStr("Del(): key='%v'", key)
+	sf.log.Debug(msg)
 	val := sf.dictVal[key]
 	delete(sf.dictVal, key)
 	sf.lstSort.Del(val)
 }
 
 // Set -- добавляет значение в контекст.
-func (sf *LocalCtx) Set(key string, val any, comment string) {
+func (sf *LocalCtx) Set(key defs.Str, val any, comment defs.Str) {
 	sf.Lock()
 	defer sf.Unlock()
-	sf.log.Debug("Set(): key='%v'", key)
+	msg:=defs.NewStr("Set(): key='%v'", key)
+	sf.log.Debug(msg)
 	_val, isOk := sf.dictVal[key]
 	if isOk {
 		val0 := _val.(*ctx_value.CtxValue)

+ 5 - 2
v4/lev1/local_ctx/local_ctx_test.go

@@ -3,6 +3,8 @@ package local_ctx
 import (
 	"context"
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
 type tester struct {
@@ -50,8 +52,9 @@ func (sf *tester) get() {
 // Устанавливает значение.
 func (sf *tester) set() {
 	sf.t.Log("set")
-	sf.lCtx.Set("count", 5, "test_val")
-	sf.lCtx.Set("count", 15, "test_val1")
+	msg:=defs.NewStr("count")
+	sf.lCtx.Set(msg, 5, "test_val")
+	sf.lCtx.Set(msg, 15, "test_val1")
 }
 
 // Создание нового локального контекста.

+ 28 - 27
v4/lev1/log_buf/log_buf.go

@@ -7,6 +7,7 @@ import (
 	"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/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf/log_msg"
 )
@@ -16,21 +17,21 @@ import (
 //	Буфер для Error -- отдельный.
 type ILogBuf interface {
 	// Debug -- сообщение отладки
-	Debug(fMsg string, args ...any)
+	Debug(fMsg defs.Str, args ...any)
 	// LogBus -- возвращает объект публикации в шину
 	// LogBus()ILogBus
 	// Info -- информационные сообщения
-	Info(fMsg string, args ...any)
+	Info(fMsg defs.Str, args ...any)
 	// Warn -- предупреждающие сообщения
-	Warn(fMsg string, args ...any)
+	Warn(fMsg defs.Str, args ...any)
 	// Err -- сообщения об ошибках
-	Err(fMsg string, args ...any)
+	Err(fMsg defs.IStr, args ...any)
 	// Get -- возвращает сообщение по номеру (0..99)
-	Get(num int) log_msg.ILogMsg
+	Get(num defs.Int) log_msg.ILogMsg
 	// GetErr -- возвращает сообщение ошибки по номеру (0..99)
-	GetErr(num int) log_msg.ILogMsg
+	GetErr(num defs.Int) log_msg.ILogMsg
 	// Size -- возвращает размер лога
-	Size() int
+	Size() defs.Int
 	// IsTerm -- возвращает признак логирования в терминал
 	IsTerm() core_spec.ISafeBool
 }
@@ -41,7 +42,7 @@ var (
 
 // LogBufParam -- параметры логирующего буфера.
 type LogBufParam struct {
-	Prefix_ string              // Префикс для сообщений
+	Prefix_ defs.Str              // Префикс для сообщений
 	IsTerm_ core_spec.ISafeBool // Признак вывода в терминал
 }
 
@@ -77,13 +78,13 @@ func (sf *LogBuf) IsTerm() core_spec.ISafeBool {
 }
 
 // GetErr -- возвращает сообщение ошибки по номеру.
-func (sf *LogBuf) GetErr(num int) log_msg.ILogMsg {
+func (sf *LogBuf) GetErr(num defs.Int) log_msg.ILogMsg {
 	sf.RLock()
 	defer sf.RUnlock()
 	if len(sf.lstErr) == 0 {
 		return log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+"not error msg")
 	}
-	if num >= len(sf.lstErr) {
+	if num.Int() >= len(sf.lstErr) {
 		return sf.lstErr[len(sf.lstErr)-1]
 	}
 	if num <= 0 {
@@ -93,13 +94,13 @@ func (sf *LogBuf) GetErr(num int) log_msg.ILogMsg {
 }
 
 // Get -- возвращает сообщение по номеру.
-func (sf *LogBuf) Get(num int) log_msg.ILogMsg {
+func (sf *LogBuf) Get(num defs.Int) log_msg.ILogMsg {
 	sf.RLock()
 	defer sf.RUnlock()
 	if len(sf.lst) == 0 {
 		return log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+"*no msg*")
 	}
-	if num >= len(sf.lst) {
+	if num.Int() >= len(sf.lst) {
 		return log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+"*no msg*")
 	}
 	if num <= 0 {
@@ -109,65 +110,65 @@ func (sf *LogBuf) Get(num int) log_msg.ILogMsg {
 }
 
 type tMsg struct {
-	text string
+	text defs.IStr
 	args []any
 }
 
 // Debug -- сообщение отладки.
-func (sf *LogBuf) Debug(fMsg string, args ...any) {
+func (sf *LogBuf) Debug(fMsg defs.IStr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
 		text: fMsg,
 		args: args,
 	}
-	strMsg := fmt.Sprintf(msg.text, msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+strMsg)
+	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
+	_msg := log_msg.NewLogMsg(log_msg.DEBUG, sf.Prefix_+defs.Str(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 	sf.printTerm(_msg)
 }
 
 // Info -- информационные сообщения.
-func (sf *LogBuf) Info(fMsg string, args ...any) {
+func (sf *LogBuf) Info(fMsg defs.Str, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
 		text: fMsg,
 		args: args,
 	}
-	strMsg := fmt.Sprintf(msg.text, msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.INFO, sf.Prefix_+strMsg)
+	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
+	_msg := log_msg.NewLogMsg(log_msg.INFO, sf.Prefix_+defs.Str(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 	sf.printTerm(_msg)
 }
 
 // Warn -- предупреждающие сообщения.
-func (sf *LogBuf) Warn(fMsg string, args ...any) {
+func (sf *LogBuf) Warn(fMsg defs.Str, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
 		text: fMsg,
 		args: args,
 	}
-	strMsg := fmt.Sprintf(msg.text, msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.WARN, sf.Prefix_+strMsg)
+	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
+	_msg := log_msg.NewLogMsg(log_msg.WARN, sf.Prefix_+defs.Str(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 	sf.printTerm(_msg)
 }
 
 // Err -- сообщения об ошибках.
-func (sf *LogBuf) Err(fMsg string, args ...any) {
+func (sf *LogBuf) Err(fMsg defs.IStr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
 		text: fMsg,
 		args: args,
 	}
-	strMsg := fmt.Sprintf(msg.text, msg.args...)
-	_msg := log_msg.NewLogMsg(log_msg.ERROR, sf.Prefix_+strMsg)
+	strMsg := fmt.Sprintf(msg.text.String(), msg.args...)
+	_msg := log_msg.NewLogMsg(log_msg.ERROR, sf.Prefix_+defs.Str(strMsg))
 	sf.lst = append(sf.lst, _msg)
 	sf.lstErr = append(sf.lstErr, _msg)
 	sf.checkLen()
@@ -176,10 +177,10 @@ func (sf *LogBuf) Err(fMsg string, args ...any) {
 }
 
 // Size -- возвращает размер буфера.
-func (sf *LogBuf) Size() int {
+func (sf *LogBuf) Size() defs.Int {
 	sf.RLock()
 	defer sf.RUnlock()
-	return len(sf.lst)
+	return defs.Int(len(sf.lst))
 }
 
 // Проверяет длину общую лога.

+ 3 - 1
v4/lev1/log_buf/log_buf_test.go

@@ -3,6 +3,7 @@ package log_buf
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
@@ -39,7 +40,8 @@ func (sf *tester) new() {
 	sf.log.Info("test msg: %v", 46)
 	sf.log.Warn("test msg: %v", 47)
 	for i := range 120 {
-		sf.log.Err("test err: %v", i)
+		err := defs.NewErr("test err: %v", i)
+		sf.log.Err(err)
 	}
 	_ = sf.log.Get(120)
 	_ = sf.log.GetErr(120)

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

@@ -5,6 +5,7 @@ import (
 	"fmt"
 
 	"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"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
@@ -38,7 +39,7 @@ type logMsg struct {
 }
 
 // NewLogMsg -- возвращает новое сообщение логгера.
-func NewLogMsg(level int, msg string) ILogMsg {
+func NewLogMsg(level int, msg defs.Str) ILogMsg {
 	sf := &logMsg{
 		createdAt: etime.NewETimeAuto(),
 		msg:       quark.NewQStr(msg),

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

@@ -8,12 +8,13 @@ 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"
 )
 
 // safeString -- потокобезопасная строка.
 type safeString struct {
 	sync.RWMutex
-	val string
+	val defs.Str
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку.
@@ -23,7 +24,7 @@ func NewSafeString() mKs.ISafeString {
 }
 
 // NewSafeStringGetenv -- возвращает новую потокобезопасную строку из окружения.
-func NewSafeStringGetenv(env string) mL0.IResult[mKs.ISafeString] {
+func NewSafeStringGetenv(env defs.Str) mL0.IResult[mKs.ISafeString] {
 	sf := NewSafeString()
 	res := sf.Getenv(env)
 	if res.IsErr() {
@@ -41,14 +42,14 @@ func (sf *safeString) Byte() []byte {
 }
 
 // Get -- возвращает хранимую строку.
-func (sf *safeString) Get() string {
+func (sf *safeString) Get() defs.Str {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val
 }
 
 // Set -- устанавливает строку.
-func (sf *safeString) Set(val string) {
+func (sf *safeString) Set(val defs.Str) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val
@@ -62,12 +63,12 @@ func (sf *safeString) Reset() {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeString) Getenv(env string) mL0.IResult[string] {
-	strVal := os.Getenv(env)
+func (sf *safeString) Getenv(env defs.Str) mL0.IResult[defs.Str] {
+	strVal := os.Getenv(env.String())
 	if strVal == "" {
 		err := fmt.Errorf("safeString.Getenv(): from env(%v), val is empty", env)
-		return mL0.NewErr[string](err)
+		return mL0.NewErr[defs.Str](err)
 	}
-	sf.val = strVal
-	return mL0.NewOk(strVal)
+	sf.val = defs.Str(strVal)
+	return mL0.NewOk(sf.val)
 }

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

@@ -6,6 +6,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/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
@@ -81,7 +82,7 @@ func (sf *kModule) IsWork() core_spec.EBool {
 }
 
 // Live -- возвращает индикатор жизни модуля.
-func (sf *kModule) Live() string {
+func (sf *kModule) Live() defs.Str {
 	return sf.strLive.Get()
 }
 

+ 6 - 4
v4/lev2/kserv_http/kserv_http.go

@@ -17,6 +17,7 @@ import (
 	"github.com/gofiber/fiber/v3/middleware/static"
 
 	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/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -181,11 +182,12 @@ func (sf *kServHttp) Run() {
 }
 
 // В отдельном потоке ждёт закрытия канала.
-func (sf *kServHttp) fnChErr(chErr <-chan string) {
+func (sf *kServHttp) fnChErr(chErr <-chan defs.Str) {
 	strErr := <-chErr
-	if strErr != "<nil>" {
-		err := fmt.Errorf("kServHttp.fnChErr(): in listen, err=\n\t%v", strErr)
-		sf.log.Err("Run(): err=\n\t%v", err.Error())
+	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())
+		sf.log.Err(msg, err)
 		sf.kCtx.Cancel()
 	}
 }

+ 2 - 1
v4/lev2/kserv_http/kserv_http_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"
@@ -42,7 +43,7 @@ func (sf *tester) close() {
 		sf.t.Fatalf("close(): isWork==true")
 	}
 	kernServHttp.Run()
-	chErr := make(chan string, 2)
+	chErr := make(chan defs.Str, 2)
 	chErr <- "test err"
 	close(chErr)
 	kernServHttp.fnChErr(chErr)

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

@@ -67,7 +67,8 @@ func (sf *kServHttpStd) Run() {
 	go func() {
 		sf.log.Debug("Run().fn(): run on http://%v", sf.server.Addr)
 		if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
-			sf.log.Err("Run.fn(): in work, err=\n\t%v", err)
+			err:=defs.NewErr("Run.fn(): in work, err=\n\t%v", err)
+			sf.log.Err(err)
 		}
 	}()
 	go sf.close()

+ 16 - 13
v4/lev2/lsi/kstore_kv/kstore_kv.go

@@ -11,6 +11,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/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -20,6 +21,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 var (
@@ -76,31 +79,31 @@ func (sf *kStoreKv) Log() comp_spec.ILogBuf {
 }
 
 // Set -- устанавливает значение по ключу.
-func (sf *kStoreKv) Set(key string, val []byte) mL0.IResult[core_spec.EBool] {
+func (sf *kStoreKv) Set(key store_ent.IStoreKeyFix, val store_ent.IStoreValFix) mL0.IResult[core_spec.EBool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Set(): key='%v'", key)
 	fnSet := func(txn *badger.Txn) error {
-		err := txn.Set([]byte(key), val)
+		err := txn.Set(key.Byte(), val)
 		return err
 	}
 	err := sf.db.Update(fnSet)
 	if err != nil {
-		err := fmt.Errorf("Set(): key=%v, err=\n\t%w", key, err)
-		sf.log.Err(err.Error())
+		err := defs.NewErr("Set(): key=%v, err=\n\t%w", key, err)
+		sf.log.Err(err)
 		return mL0.NewErr[core_spec.EBool](err)
 	}
 	return mL0.NewOk(ebool.NewEBool(true))
 }
 
 // Get -- возвращает значение по ключу.
-func (sf *kStoreKv) Get(key string) mL0.IResult[[]byte] {
+func (sf *kStoreKv) Get(key store_ent.IStoreKeyFix) mL0.IResult[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	sf.log.Debug("Get(): key='%v'", key)
 	var binVal []byte
 	fnGet := func(txn *badger.Txn) error {
-		item, err := txn.Get([]byte(key))
+		item, err := txn.Get(key.Byte())
 		if err != nil {
 			return err
 		}
@@ -109,18 +112,18 @@ func (sf *kStoreKv) Get(key string) mL0.IResult[[]byte] {
 	}
 	err := sf.db.View(fnGet)
 	if err != nil {
-		err := fmt.Errorf("Get(): key=%v, err=\n\t%v", key, err)
-		sf.log.Err(err.Error())
+		err := defs.NewErr("Get(): key=%v, err=\n\t%v", key, err)
+		sf.log.Err(err)
 		return mL0.NewErr[[]byte](err)
 	}
 	return mL0.NewOk(binVal)
 }
 
 // ByPrefix -- фильтрует ключи по префиксу.
-func (sf *kStoreKv) ByPrefix(prefix string) mL0.IResult[[]string] {
+func (sf *kStoreKv) ByPrefix(prefix store_ent.IStoreKeyFix) mL0.IResult[[]store_ent.AStoreKey] {
 	var (
 		binKey []byte
-		lstKey = []string{}
+		lstKey = []store_ent.AStoreKey{}
 	)
 	// fnValue := func(v []byte) error {
 	// 	fmt.Printf("key=%s, value=%s\n", key, v)
@@ -129,7 +132,7 @@ func (sf *kStoreKv) ByPrefix(prefix string) mL0.IResult[[]string] {
 	fnPrefix := func(txn *badger.Txn) error {
 		it := txn.NewIterator(badger.DefaultIteratorOptions)
 		defer it.Close()
-		binPref := []byte(prefix)
+		binPref:=prefix.Byte()
 		for it.Seek(binPref); it.ValidForPrefix(binPref); it.Next() {
 			item := it.Item()
 			binKey = item.Key()
@@ -137,14 +140,14 @@ func (sf *kStoreKv) ByPrefix(prefix string) mL0.IResult[[]string] {
 			// if err != nil {
 			// 	return err
 			// }
-			lstKey = append(lstKey, string(binKey))
+			lstKey = append(lstKey, store_key.AStoreKey(binKey))
 		}
 		return nil
 	}
 	err := sf.db.View(fnPrefix)
 	if err != nil {
 		err := fmt.Errorf("ByPrefix(): in find, err=\n\t%w", err)
-		return mL0.NewErr[[]string](err)
+		return mL0.NewErr[[]defs.Str](err)
 	}
 	return mL0.NewOk(lstKey)
 }

+ 16 - 7
v4/lev2/lsi/kstore_kv/kstore_kv_test.go

@@ -9,6 +9,8 @@ import (
 	"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"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 type tester struct {
@@ -46,7 +48,8 @@ func TestKernelStore(t *testing.T) {
 // Установка ключа после закрытия хранилища.
 func (sf *tester) workBad1() {
 	sf.t.Log("workBad1")
-	res := kernStore.Set("test_key", []byte("test_val"))
+	key:=store_ent.NewStoreKeyFix("test_key")
+	res := kernStore.Set(key, []byte("test_val"))
 	if res.IsOk() {
 		sf.t.Fatalf("workBad1(): set, err==nil")
 	}
@@ -67,7 +70,8 @@ func (sf *tester) del() {
 	if res.IsErr() {
 		sf.t.Fatalf("del(): err=%v", res.Err())
 	}
-	opt := kernStore.Get("test_key")
+	key := store_ent.NewStoreKeyFix("test_key")
+	opt := kernStore.Get(key)
 	if opt.IsOk() {
 		sf.t.Fatalf("del(): val!=nil")
 	}
@@ -76,11 +80,13 @@ func (sf *tester) del() {
 // Поиск по префиксу.
 func (sf *tester) byPrefix() {
 	sf.t.Log("byPrefix")
-	res0 := kernStore.Set("test_key2", []byte("test_key2"))
+	key := store_key.NewStoreKey("test_key2")
+	res0 := kernStore.Set(key, []byte("test_key2"))
 	if res0.IsErr() {
 		sf.t.Fatalf("byPrefix(): err=%v", res0.Err())
 	}
-	res := kernStore.ByPrefix("test")
+	key = store_key.NewStoreKey("test")
+	res := kernStore.ByPrefix(key)
 	res.Hassert("byPrefix(): val == nil")
 	lstKey := res.Ok()
 	if len(lstKey) != 2 {
@@ -91,7 +97,8 @@ func (sf *tester) byPrefix() {
 // Получение значения по ключу.
 func (sf *tester) get() {
 	sf.t.Log("get")
-	res := kernStore.Get("test_key")
+	key := store_key.NewStoreKey("test_key")
+	res := kernStore.Get(key)
 	res.Hassert("get(): val==nil")
 	strVal := string(res.Ok())
 	if strVal != "test_val" {
@@ -102,7 +109,8 @@ func (sf *tester) get() {
 // Добавление ключа в хранилище.
 func (sf *tester) set() {
 	sf.t.Log("set")
-	res := kernStore.Set("test_key", []byte("test_val"))
+	key := store_key.NewStoreKey("test_key")
+	res := kernStore.Set(key, []byte("test_val"))
 	if res.IsErr() {
 		sf.t.Fatalf("set(): err=%v", res.Err())
 	}
@@ -121,7 +129,8 @@ func (sf *tester) close() {
 	go sf.wg.Done(qName)
 	sf.wg.Wait()
 	kernStore.close()
-	res1 := kernStore.ByPrefix("test")
+	prefix := store_ent.NewStoreKeyFix("test")
+	res1 := kernStore.ByPrefix(prefix)
 	if res1.IsOk() {
 		sf.t.Fatalf("close(): val!=nil")
 	}

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

@@ -10,8 +10,8 @@ import (
 type IRecVal interface {
 	// Key -- возвращает ключ
 	Key() store_key.IStoreKeyFix
-	// Val -- возвращает значение
-	Val() []byte
+	// Byte -- возвращает байтовое значение
+	Byte() []byte
 }
 
 var (
@@ -47,7 +47,7 @@ func (sf *RecVal) Key() store_key.IStoreKeyFix {
 	return store_key.NewStoreKey(sf.Key_)
 }
 
-// Val -- значение.
-func (sf *RecVal) Val() []byte {
+// Byte -- байтовое значение.
+func (sf *RecVal) Byte() []byte {
 	return sf.Val_
 }

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

@@ -2,6 +2,7 @@ package store_ent
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/dict_rec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_val"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
@@ -27,3 +28,6 @@ type IDictRec = dict_rec.IDictRec
 func NewDictRec() IDictRec {
 	return dict_rec.NewDictRec()
 }
+
+// IRecordVal -- значение ключа хранилища.
+type IRecordVal = rec_val.IRecordVal

+ 9 - 0
v4/lev2/lsi/store_ent/store_key/store_key.go

@@ -14,6 +14,8 @@ type IStoreKeyFix interface {
 	String() string
 	// Get -- получить значение ключа хранилища.
 	Get() AStoreKey
+	// Byte -- получить значение ключа хранилища в виде байтов.
+	Byte() []byte
 }
 
 // StoreKey -- ключ хранилища.
@@ -29,6 +31,13 @@ func NewStoreKey(val AStoreKey) *StoreKey {
 	}
 }
 
+// Byte -- получить значение ключа хранилища в виде байтов.
+//
+//go:fix inline
+func (sf *StoreKey) Byte() []byte {
+	return []byte(sf.val)
+}
+
 // String -- строковое представление.
 //
 //go:fix inline

+ 6 - 5
v4/lev2/kspec/ikernel_store_kv.go → v4/lev2/lsi/store_spec/ikernel_store_kv.go

@@ -1,20 +1,21 @@
-package kspec
+package store_spec
 
 import (
 	"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"
 )
 
 // IKernelStoreKv -- интерфейс к локальному быстрому key-value хранилищу ядра.
 type IKernelStoreKv interface {
 	// Get -- возвращает значение по ключу
-	Get(key string) core_spec.IResult[[]byte]
+	Get(key defs.Str) core_spec.IResult[[]byte]
 	// ByPrefix -- возвращает список ключей по префиксу
-	ByPrefix(prefix string) core_spec.IResult[[]string]
+	ByPrefix(prefix defs.Str) core_spec.IResult[[]defs.Str]
 	// Set -- устанавливает значение по ключу
-	Set(key string, val []byte) core_spec.IResult[core_spec.EBool]
+	Set(key defs.Str, val []byte) core_spec.IResult[core_spec.EBool]
 	// Delete -- удаляет значение по ключу
-	Delete(key string) core_spec.IResult[core_spec.EBool]
+	Delete(key defs.Str) core_spec.IResult[core_spec.EBool]
 	// Log -- возвращает локальный лог
 	Log() comp_spec.ILogBuf
 }

+ 1 - 1
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -56,7 +56,7 @@ func NewClientBusHttp(urlRemote string) bus_spec.IBusClient {
 		bus:       kBusHttp,
 		isWork:    mL1.NewSafeBool(true),
 		urlRemote: strings.TrimSuffix(urlRemote, "/"),
-		urlLocal:  strings.TrimSuffix(urlLocal.Get(), "/"),
+		urlLocal:  strings.TrimSuffix(urlLocal.Get().String(), "/"),
 	}
 	return sf
 }

+ 2 - 1
v4/lev3/mod_spec/imod_base.go

@@ -2,6 +2,7 @@ package mod_spec
 
 import (
 	"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/lev3/mod_ent/module_name"
 )
@@ -19,7 +20,7 @@ type IKernelModule interface {
 	// Log -- возвращает буферный лог модуля
 	Log() comp_spec.ILogBuf
 	// Live -- "сигнал жизни"
-	Live() string
+	Live() defs.Str
 	// Stat -- возвращает статистику модуля
 	Stat() IModuleStat
 }