diff --git a/micro/microfunctions.go b/micro/microfunctions.go index 1ee3656c..e2e820f9 100644 --- a/micro/microfunctions.go +++ b/micro/microfunctions.go @@ -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 +} diff --git a/micro/microfunctions_test.go b/micro/microfunctions_test.go index 98151047..d91a8bd2 100644 --- a/micro/microfunctions_test.go +++ b/micro/microfunctions_test.go @@ -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) + } +} diff --git a/microl/microl.go b/microl/microl.go index ba897005..eb0312f7 100644 --- a/microl/microl.go +++ b/microl/microl.go @@ -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 + } +} diff --git a/microl/microl_test.go b/microl/microl_test.go index 942fa2f2..46417be0 100644 --- a/microl/microl_test.go +++ b/microl/microl_test.go @@ -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") + } + +}