Skip to content

providers/basicflag should not output a value when the user has not set it #320

@qianlongzt

Description

@qianlongzt

Describe the bug

The provider order is environment variables first, then flags. If the user sets a value in the environment but not in the flag, the environment value should be used.

To Reproduce

package main

import (
	"flag"
	"strings"
	"testing"

	"github.com/knadh/koanf/providers/basicflag"
	"github.com/knadh/koanf/providers/env"
	"github.com/knadh/koanf/v2"
	"github.com/stretchr/testify/assert"
)

type config struct {
	Port  int `koanf:"PORT"`
	Port2 int `koanf:"PORT2"`
}

func TestMain(t *testing.T) {
	var k = koanf.New(".")

	t.Setenv("TEST_PORT", "8080")
	t.Setenv("TEST_PORT2", "8080")
	if err := k.Load(env.Provider("TEST_", ".", func(s string) string {
		return strings.TrimPrefix(s, "TEST_")
	}), nil); err != nil {
		t.Fatal(err)
		return
	}

	f := flag.NewFlagSet("test", flag.ExitOnError)
	f.String("PORT", "", "port")
	f.String("PORT2", "", "port2")
	if err := f.Parse([]string{"-PORT2=1234"}); err != nil {
		t.Fatal(err)
	}
	if err := k.Load(basicflag.ProviderWithValue(f, ".", nil, k), nil); err != nil {
		t.Fatal(err)
		return
	}
	c := &config{}
	if err := k.Unmarshal("", c); err != nil {
		t.Fatal(err)
	}
	assert.Equal(t, 8080, c.Port, "PORT env,no flag") //fail got 0
	assert.Equal(t, 1234, c.Port2, "PORT2 env, flag")
}

image

Expected behavior

c.Port should be 8080

Please provide the following information):

github.com/knadh/koanf/providers/basicflag v1.0.0
github.com/knadh/koanf/providers/env v0.1.0
github.com/knadh/koanf/v2 v2.1.1

https://github.com/knadh/koanf/blob/master/providers/basicflag/basicflag.go#L99
https://github.com/knadh/koanf/blob/master/providers/posflag/posflag.go#L93

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions