Browse Source

SVI Доработка типов; 100.0%

SVI 9 months ago
parent
commit
59c69119dd

+ 52 - 0
v2/kc/safe_bool/safe_bool.go

@@ -2,6 +2,9 @@
 package safe_bool
 
 import (
+	"fmt"
+	"os"
+	"strings"
 	"sync"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
@@ -19,6 +22,28 @@ func NewSafeBool() ISafeBool {
 	return sf
 }
 
+// NewSafeBoolFromStr -- возвращает новое потокобезоппсное булево из строки
+func NewSafeBoolFromStr(strVal string) Result[ISafeBool] {
+	sf := NewSafeBool()
+	res := sf.FromStr(strVal)
+	if res.IsErr() {
+		err := fmt.Errorf("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
+		return NewErr[ISafeBool](err)
+	}
+	return NewOk(sf)
+}
+
+// NewSafeBoolGetenv -- возвращает новое потокобезоппсное целое из окружения
+func NewSafeBoolGetenv(env string) Result[ISafeBool] {
+	sf := NewSafeBool()
+	res := sf.Getenv(env)
+	if res.IsErr() {
+		err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
+		return NewErr[ISafeBool](err)
+	}
+	return NewOk(sf)
+}
+
 // Get -- возвращает хранимый булевый признак
 func (sf *safeBool) Get() bool {
 	sf.RLock()
@@ -39,3 +64,30 @@ func (sf *safeBool) Reset() {
 	defer sf.Unlock()
 	sf.val = false
 }
+
+// FromStr -- получает число из строки
+func (sf *safeBool) FromStr(strVal string) Result[bool] {
+	strVal = strings.ToLower(strVal)
+	sf.Lock()
+	defer sf.Unlock()
+	switch strVal {
+	case "true":
+		sf.val = true
+	case "false":
+		sf.val = false
+	default:
+		return NewErr[bool](fmt.Errorf("safeBool.FromStr(): val(%v) bad", strVal))
+	}
+	return NewOk(sf.val)
+}
+
+// Getenv -- получает значение из окружения
+func (sf *safeBool) Getenv(env string) Result[bool] {
+	strVal := os.Getenv(env)
+	res := sf.FromStr(strVal)
+	if res.IsErr() {
+		err := fmt.Errorf("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Err())
+		return NewErr[bool](err)
+	}
+	return res
+}

+ 78 - 0
v2/kc/safe_bool/safe_bool_test.go

@@ -1,6 +1,7 @@
 package safe_bool
 
 import (
+	"os"
 	"testing"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
@@ -18,6 +19,83 @@ func TestSAfeBool(t *testing.T) {
 	sf.create()
 	sf.set()
 	sf.reset()
+	sf.newFromEnv()
+	sf.newFromStr()
+}
+
+// Булево из строки
+func (sf *tester) newFromStr() {
+	sf.t.Log("newFromStr")
+	sf.newFromStrBad1()
+	sf.newFromStrGood1()
+}
+
+func (sf *tester) newFromStrGood1() {
+	sf.t.Log("newFromStrGood1")
+	res := NewSafeBoolFromStr("tRuE")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromStrGood1(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != true {
+		sf.t.Fatalf("newFromStrGood1(): val==false")
+	}
+}
+
+// Кривое булево значение
+func (sf *tester) newFromStrBad1() {
+	sf.t.Log("newFromStrBad1")
+	res := NewSafeBoolFromStr("0")
+	if res.IsOk() {
+		sf.t.Fatalf("newFromStrBad1(): err==nil")
+	}
+}
+
+// Булево из окружения
+func (sf *tester) newFromEnv() {
+	sf.t.Log("newFromEnv")
+	sf.newFromEnvBad1()
+	sf.newFromEnvGood1()
+	sf.newFromEnvGood2()
+}
+
+func (sf *tester) newFromEnvGood2() {
+	sf.t.Log("newFromEnvGood2")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "false")
+	res := NewSafeBoolGetenv("TEST_BOOL")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != false {
+		sf.t.Fatalf("newFromEnvGood2(): val==true")
+	}
+}
+
+func (sf *tester) newFromEnvGood1() {
+	sf.t.Log("newFromEnvGood1")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "true")
+	res := NewSafeBoolGetenv("TEST_BOOL")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != true {
+		sf.t.Fatalf("newFromEnvGood1(): val==false")
+	}
+}
+
+// Кривое булево значение
+func (sf *tester) newFromEnvBad1() {
+	sf.t.Log("newFromStrBad1")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "bad")
+	res := NewSafeBoolGetenv("TEST_BOOL")
+	if res.IsOk() {
+		sf.t.Fatalf("newFromStrBad1(): err==nil")
+	}
 }
 
 // Сбрасывает хранимое значение

+ 52 - 0
v2/kc/safe_bool_react/safe_bool_react.go

@@ -2,6 +2,9 @@
 package safe_bool_react
 
 import (
+	"fmt"
+	"os"
+	"strings"
 	"sync"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v2/kc/helpers"
@@ -23,6 +26,28 @@ func NewSafeBoolReact() ISafeBoolReact {
 	return sf
 }
 
+// NewSafeBoolReactFromStr -- возвращает новое потокобезоппсное булево с реакцией из строки
+func NewSafeBoolReactFromStr(strVal string) Result[ISafeBoolReact] {
+	sf := NewSafeBoolReact()
+	res := sf.FromStr(strVal)
+	if res.IsErr() {
+		err := fmt.Errorf("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
+		return NewErr[ISafeBoolReact](err)
+	}
+	return NewOk(sf)
+}
+
+// NewSafeBoolGetenv -- возвращает новое потокобезоппсное целое с реакцией из окружения
+func NewSafeBoolGetenv(env string) Result[ISafeBoolReact] {
+	sf := NewSafeBoolReact()
+	res := sf.Getenv(env)
+	if res.IsErr() {
+		err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
+		return NewErr[ISafeBoolReact](err)
+	}
+	return NewOk(sf)
+}
+
 // Delete -- удаляет функцию обратного вызова из наблюдения
 func (sf *safeBoolReact) Delete(key string) {
 	sf.Lock()
@@ -66,3 +91,30 @@ func (sf *safeBoolReact) Reset() {
 		fn(false)
 	}
 }
+
+// FromStr -- получает число из строки
+func (sf *safeBoolReact) FromStr(strVal string) Result[bool] {
+	strVal = strings.ToLower(strVal)
+	sf.Lock()
+	defer sf.Unlock()
+	switch strVal {
+	case "true":
+		sf.val = true
+	case "false":
+		sf.val = false
+	default:
+		return NewErr[bool](fmt.Errorf("safeBoolReact.FromStr(): val(%v) bad", strVal))
+	}
+	return NewOk(sf.val)
+}
+
+// Getenv -- получает значение из окружения
+func (sf *safeBoolReact) Getenv(env string) Result[bool] {
+	strVal := os.Getenv(env)
+	res := sf.FromStr(strVal)
+	if res.IsErr() {
+		err := fmt.Errorf("safeBoolReact.Getenv(): from env %v, err=\n\t%w", env, res.Err())
+		return NewErr[bool](err)
+	}
+	return res
+}

+ 78 - 0
v2/kc/safe_bool_react/safe_bool_react_test.go

@@ -1,6 +1,7 @@
 package safe_bool_react
 
 import (
+	"os"
 	"testing"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
@@ -21,6 +22,83 @@ func TestSafeBoolReact(t *testing.T) {
 	sf.set()
 	sf.reset()
 	sf.del()
+	sf.newFromEnv()
+	sf.newFromStr()
+}
+
+// Булево из строки
+func (sf *tester) newFromStr() {
+	sf.t.Log("newFromStr")
+	sf.newFromStrBad1()
+	sf.newFromStrGood1()
+}
+
+func (sf *tester) newFromStrGood1() {
+	sf.t.Log("newFromStrGood1")
+	res := NewSafeBoolReactFromStr("tRuE")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromStrGood1(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != true {
+		sf.t.Fatalf("newFromStrGood1(): val==false")
+	}
+}
+
+// Кривое булево значение
+func (sf *tester) newFromStrBad1() {
+	sf.t.Log("newFromStrBad1")
+	res := NewSafeBoolReactFromStr("0")
+	if res.IsOk() {
+		sf.t.Fatalf("newFromStrBad1(): err==nil")
+	}
+}
+
+// Булево из окружения
+func (sf *tester) newFromEnv() {
+	sf.t.Log("newFromEnv")
+	sf.newFromEnvBad1()
+	sf.newFromEnvGood1()
+	sf.newFromEnvGood2()
+}
+
+func (sf *tester) newFromEnvGood2() {
+	sf.t.Log("newFromEnvGood2")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "false")
+	res := NewSafeBoolGetenv("TEST_BOOL")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != false {
+		sf.t.Fatalf("newFromEnvGood2(): val==true")
+	}
+}
+
+func (sf *tester) newFromEnvGood1() {
+	sf.t.Log("newFromEnvGood1")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "true")
+	res := NewSafeBoolGetenv("TEST_BOOL")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != true {
+		sf.t.Fatalf("newFromEnvGood1(): val==false")
+	}
+}
+
+// Кривое булево значение
+func (sf *tester) newFromEnvBad1() {
+	sf.t.Log("newFromStrBad1")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "bad")
+	res := NewSafeBoolGetenv("TEST_BOOL")
+	if res.IsOk() {
+		sf.t.Fatalf("newFromStrBad1(): err==nil")
+	}
 }
 
 // Удаляет функцию обратного вызова

+ 24 - 0
v2/kc/safe_string/safe_string.go

@@ -2,6 +2,8 @@
 package safe_string
 
 import (
+	"fmt"
+	"os"
 	"sync"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
@@ -19,6 +21,17 @@ func NewSafeString() ISafeString {
 	return sf
 }
 
+// NewSafeStringGetenv -- возвращает новуб потокобезопасную строку из окружения
+func NewSafeStringGetenv(env string) Result[ISafeString] {
+	sf := NewSafeString()
+	res := sf.Getenv(env)
+	if res.IsErr() {
+		err := fmt.Errorf("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
+		return NewErr[ISafeString](err)
+	}
+	return NewOk(sf)
+}
+
 // Byte -- возвращает байтовое представление строки
 func (sf *safeString) Byte() []byte {
 	sf.RLock()
@@ -46,3 +59,14 @@ func (sf *safeString) Reset() {
 	defer sf.Unlock()
 	sf.val = ""
 }
+
+// Getenv -- получает значение из окружения
+func (sf *safeString) Getenv(env string) Result[string] {
+	strVal := os.Getenv(env)
+	if strVal == "" {
+		err := fmt.Errorf("safeString.Getenv(): from env(%v), val is empty", env)
+		return NewErr[string](err)
+	}
+	sf.val = strVal
+	return NewOk(strVal)
+}

+ 49 - 0
v2/kc/safe_string/safe_string_test.go

@@ -1,6 +1,7 @@
 package safe_string
 
 import (
+	"os"
 	"testing"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
@@ -18,6 +19,54 @@ func TestSafeString(t *testing.T) {
 	sf.new()
 	sf.set()
 	sf.reset()
+	sf.newFromEnv()
+}
+
+// Булево из окружения
+func (sf *tester) newFromEnv() {
+	sf.t.Log("newFromEnv")
+	sf.newFromEnvBad1()
+	sf.newFromEnvGood1()
+	sf.newFromEnvGood2()
+}
+
+func (sf *tester) newFromEnvGood2() {
+	sf.t.Log("newFromEnvGood2")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "false")
+	res := NewSafeStringGetenv("TEST_BOOL")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != "false" {
+		sf.t.Fatalf("newFromEnvGood2(): val==true")
+	}
+}
+
+func (sf *tester) newFromEnvGood1() {
+	sf.t.Log("newFromEnvGood1")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "true")
+	res := NewSafeStringGetenv("TEST_BOOL")
+	if res.IsErr() {
+		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
+	}
+	sb := res.Val()
+	if val := sb.Get(); val != "true" {
+		sf.t.Fatalf("newFromEnvGood1(): val==false")
+	}
+}
+
+// Кривое булево значение
+func (sf *tester) newFromEnvBad1() {
+	sf.t.Log("newFromEnvBad1")
+	os.Unsetenv("TEST_BOOL")
+	os.Setenv("TEST_BOOL", "")
+	res := NewSafeStringGetenv("TEST_BOOL")
+	if res.IsOk() {
+		sf.t.Fatalf("newFromEnvBad1(): err==nil")
+	}
 }
 
 // Сбрасывает хранимое значение

+ 4 - 0
v2/krn/ktypes/isafe_bool.go

@@ -8,4 +8,8 @@ type ISafeBool interface {
 	Set()
 	// Reset -- сбрасывает хранимое потокобезопасное значение
 	Reset()
+	// FromStr -- устанавливет значение из строки
+	FromStr(string) Result[bool]
+	// Getenv -- устанавливает зачение из окружения
+	Getenv(string) Result[bool]
 }

+ 3 - 1
v2/krn/ktypes/isafe_string.go

@@ -8,6 +8,8 @@ type ISafeString interface {
 	Set(string)
 	// Reset -- сбрасывает хранимое потокобезопасное значение
 	Reset()
-	// Byte - -возвращает байтовое представление строки
+	// Byte -- возвращает байтовое представление строки
 	Byte() []byte
+	// Getenv -- устанавливает строку из переменной окружения
+	Getenv(string) Result[string]
 }