1
0
mirror of https://github.com/ManyakRus/starter.git synced 2025-11-27 23:18:34 +02:00

сделал Set_FieldFromEnv_String()

This commit is contained in:
Nikitin Aleksandr
2024-11-28 16:59:40 +03:00
parent be0645dd17
commit 1a02361c36
4 changed files with 104 additions and 0 deletions

View File

@@ -1286,3 +1286,41 @@ func Date_from_TimestampReference(Timestamp *timestamppb.Timestamp) time.Time {
return Otvet
}
// SetFieldValue - устанавливает значение поля в структуре
// Параметры:
// Object - ссылка(&) на структуру
// FieldName - название поля
// Value - значение нужного типа
// Возвращает ошибку
func SetFieldValue(Object any, FieldName string, Value any) error {
var err error
ref := reflect.ValueOf(Object)
//sanek
if ref.Kind() != reflect.Ptr {
err = fmt.Errorf("expected pointer but got %s", ref.Kind().String())
return err
}
// if its a pointer, resolve its Value
if ref.Kind() == reflect.Ptr {
ref = reflect.Indirect(ref)
}
if ref.Kind() == reflect.Interface {
ref = ref.Elem()
}
//should double check we now have a struct (could still be anything)
if ref.Kind() != reflect.Struct {
err = fmt.Errorf("expected struct but got %s", ref.Kind().String())
return err
}
prop := ref.FieldByName(FieldName)
prop.Set(reflect.ValueOf(Value))
return err
}

View File

@@ -1282,3 +1282,29 @@ func TestDate_from_TimestampReference(t *testing.T) {
t.Errorf("Expected time.Time{}, but got %s", result)
}
}
func TestSetFieldValue(t *testing.T) {
type Struct1 struct {
Field1 string
}
Struct := &Struct1{}
SetFieldValue(Struct, "Field1", "Test")
if Struct.Field1 != "Test" {
t.Errorf("Expected 'Test', but got %s", Struct.Field1)
}
}
func TestSetFieldValue2(t *testing.T) {
type Struct1 struct {
Field1 int
}
Struct := &Struct1{}
SetFieldValue(Struct, "Field1", "1")
if Struct.Field1 != 1 {
t.Errorf("Expected 'Test', but got %v", Struct.Field1)
}
}

View File

@@ -3,7 +3,9 @@
package microl
import (
"fmt"
"github.com/ManyakRus/starter/log"
"github.com/ManyakRus/starter/micro"
"os"
)
@@ -17,3 +19,19 @@ func Getenv(Name string, IsRequired bool) string {
return Otvet
}
// Set_FieldFromEnv_String - устанавливает значение поля из переменной окружения
// Параметры:
// Object - указатель на структуру
// FieldName - имя поля
func Set_FieldFromEnv_String(StructReference any, FieldName string, IsRequired bool) {
Value := Getenv(FieldName, IsRequired)
err := micro.SetFieldValue(StructReference, FieldName, Value)
if err != nil {
err = fmt.Errorf("SetFieldFrom() FieldName: %s error: %w", FieldName, err)
log.Error(err)
return
}
}

View File

@@ -1 +1,23 @@
package microl
import (
"os"
"testing"
)
func TestSet_FieldFromEnv(t *testing.T) {
type Struct1 struct {
TestSet_FieldFromEnv string
}
Name := "TestSet_FieldFromEnv"
os.Setenv(Name, Name)
Struct := Struct1{}
Set_FieldFromEnv_String(&Struct, Name, true)
if Struct.TestSet_FieldFromEnv != Name {
t.Error("Set_FieldFromEnv_String() error")
}
}