@@ -24,6 +24,13 @@ type Setter interface {
2424// If a field is unexported or required configuration is not
2525// found, an error will be returned.
2626func Set (i interface {}) (err error ) {
27+ return SetPrefix (i , "" )
28+ }
29+
30+ // SetPrefix sets the fields of a struct from environment config
31+ // with a given prefix. If a field is unexported or required
32+ // configuration is not found, an error will be returned.
33+ func SetPrefix (i interface {}, prefix string ) (err error ) {
2734 v := reflect .ValueOf (i )
2835
2936 // Don't try to process a non-pointer value.
@@ -35,7 +42,7 @@ func Set(i interface{}) (err error) {
3542 t := reflect .TypeOf (i ).Elem ()
3643
3744 for i := 0 ; i < t .NumField (); i ++ {
38- if err = processField (t .Field (i ), v .Field (i )); err != nil {
45+ if err = processField (prefix , t .Field (i ), v .Field (i )); err != nil {
3946 return
4047 }
4148 }
@@ -47,7 +54,7 @@ func Set(i interface{}) (err error) {
4754// and attempt to set it. If not found, another check for the
4855// "required" tag will be performed to decided whether an error
4956// needs to be returned.
50- func processField (t reflect.StructField , v reflect.Value ) (err error ) {
57+ func processField (prefix string , t reflect.StructField , v reflect.Value ) (err error ) {
5158 envTag , ok := t .Tag .Lookup ("env" )
5259 if ! ok {
5360 return
@@ -61,7 +68,7 @@ func processField(t reflect.StructField, v reflect.Value) (err error) {
6168
6269 // Lookup the environment variable and if found, set and
6370 // return
64- env , ok := os .LookupEnv (envTag )
71+ env , ok := os .LookupEnv (prefix + envTag )
6572 if ok {
6673 return setField (t , v , env )
6774 }
0 commit comments