Pointer structs not created with env prefixes
mrsimonemms opened this issue · 4 comments
Following the issue raised in #202, if a pointer struct is used then the default object is not created - this is different to a non-pointer object. See the following example:
package main
import (
"encoding/json"
"fmt"
"log"
"os"
"github.com/caarlos0/env/v6"
)
type Test struct {
Str string `env:"TEST"`
}
type ComplexConfig struct {
Foo *Test `envPrefix:"FOO_"`
Bar Test `envPrefix:"BAR_"`
Clean *Test
}
func main() {
os.Setenv("FOO_TEST", "kek")
os.Setenv("BAR_TEST", "lel")
cfg := ComplexConfig{}
err := env.Parse(&cfg)
if err != nil {
log.Fatal(err)
}
confBytes, _ := json.Marshal(cfg)
fmt.Printf("%s", confBytes)
}
This results in:
{"Foo":null,"Bar":{"Str":"lel"},"Clean":null}
Notice how Foo
is null
, but Bar
has the object created.
yes, pointers need to be non-nil, otherwise env ignores them... I can't quite remember exactly why, will take a look when I have some time.
https://github.com/caarlos0/env/compare/nilptr?expand=1
this would init the pointers, but break a lot of other things... would need to investigate more... some other day
in the meantime, if anyone knows a lot about the reflect pkg and wants to take a look
Hi @caarlos0 ,
I tried to fix the nil pointer issue,
Please take a look at this pull request once when you get some time,
Changes:
- If a struct pointer field is nil, it will be initialised first & then used for further processing.
- If custom parse function is defined on any type, we don't traverse through the struct recursively.
Thanks
thanks @NithinGudla!