From 25ca56a52d6646f7949aa1cea345f27dadf2df1e Mon Sep 17 00:00:00 2001 From: acoshift Date: Sun, 13 May 2018 14:25:17 +0700 Subject: [PATCH] add yaml reader --- configfile.go | 19 +++++++++++++++++-- configfile_test.go | 18 +++++++++++++++--- internal/reader/dir.go | 5 +++++ internal/reader/error.go | 7 +++++++ internal/reader/yaml.go | 31 +++++++++++++++++++++++++++++++ testdata/config.yaml | 5 +++++ 6 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 internal/reader/error.go create mode 100644 internal/reader/yaml.go create mode 100644 testdata/config.yaml diff --git a/configfile.go b/configfile.go index ec4ca6d..0800a40 100644 --- a/configfile.go +++ b/configfile.go @@ -2,15 +2,30 @@ package configfile import ( "io" + "os" "strconv" "strings" "github.com/acoshift/configfile/internal/reader" ) -// NewReader creates new config reader with custom base path +// NewReader creates new config reader func NewReader(base string) *Reader { - return &Reader{&reader.Dir{Base: base}} + stats, _ := os.Stat(base) + if stats != nil && !stats.IsDir() { + return &Reader{reader.NewYAML(base)} + } + return &Reader{reader.NewDir(base)} +} + +// NewDirReader creates new config dir reader +func NewDirReader(base string) *Reader { + return &Reader{reader.NewDir(base)} +} + +// NewYAMLReader creates new yaml reader +func NewYAMLReader(filename string) *Reader { + return &Reader{reader.NewYAML(filename)} } type intlReader interface { diff --git a/configfile_test.go b/configfile_test.go index a12ac92..fc619da 100644 --- a/configfile_test.go +++ b/configfile_test.go @@ -7,9 +7,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestConfigfile(t *testing.T) { - c := configfile.NewReader("testdata") - +func testReader(t *testing.T, c *configfile.Reader) { t.Run("NotFound", func(t *testing.T) { t.Parallel() @@ -256,3 +254,17 @@ func TestConfigfile(t *testing.T) { }) }) } + +func TestDirReader(t *testing.T) { + t.Parallel() + + testReader(t, configfile.NewDirReader("testdata")) + testReader(t, configfile.NewReader("testdata")) +} + +func TestYAMLReader(t *testing.T) { + t.Parallel() + + testReader(t, configfile.NewYAMLReader("testdata/config.yaml")) + testReader(t, configfile.NewReader("testdata/config.yaml")) +} diff --git a/internal/reader/dir.go b/internal/reader/dir.go index 68a87af..4b20211 100644 --- a/internal/reader/dir.go +++ b/internal/reader/dir.go @@ -5,6 +5,11 @@ import ( "path/filepath" ) +// NewDir creates new dir reader +func NewDir(dir string) *Dir { + return &Dir{dir} +} + // Dir reads config from directory type Dir struct { Base string diff --git a/internal/reader/error.go b/internal/reader/error.go new file mode 100644 index 0000000..28759c8 --- /dev/null +++ b/internal/reader/error.go @@ -0,0 +1,7 @@ +package reader + +import "errors" + +var ( + errNotFound = errors.New("reader: not found") +) diff --git a/internal/reader/yaml.go b/internal/reader/yaml.go new file mode 100644 index 0000000..3f27282 --- /dev/null +++ b/internal/reader/yaml.go @@ -0,0 +1,31 @@ +package reader + +import ( + "os" + + yaml "gopkg.in/yaml.v2" +) + +// NewYAML creates new yaml reader +func NewYAML(filename string) *YAML { + var r YAML + fs, _ := os.Open(filename) + if fs != nil { + yaml.NewDecoder(fs).Decode(&r.d) + } + return &r +} + +// YAML reads config from yaml file +type YAML struct { + d map[string]string +} + +// Read reads a config +func (r *YAML) Read(name string) ([]byte, error) { + p, ok := r.d[name] + if !ok { + return nil, errNotFound + } + return []byte(p), nil +} diff --git a/testdata/config.yaml b/testdata/config.yaml new file mode 100644 index 0000000..907810b --- /dev/null +++ b/testdata/config.yaml @@ -0,0 +1,5 @@ +data1: "true" +data2: "false" +data3: "9" +data4: "0" +empty: \ No newline at end of file