From ecbda4782314c3e0d77d17474921f61c729cd669 Mon Sep 17 00:00:00 2001 From: Softonik Date: Wed, 10 Nov 2021 07:25:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20bool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goconf.go | 55 +++++++++++++++++++++++++++++++++++++++++++------- goconf_test.go | 18 +++++++++++------ 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/goconf.go b/goconf.go index 9f6f860..e94e26a 100644 --- a/goconf.go +++ b/goconf.go @@ -76,15 +76,17 @@ func (c *ConfigParser) digConfigElement(e ast.Expr) error { return errors.New("Key not found") } - value, ok := keyvalue.Value.(*ast.BasicLit) - if !ok { + switch keyvalue.Value.(type) { + case *ast.BasicLit, *ast.Ident: + return c.setConfigElement(key.Name, keyvalue.Value) + default: return errors.New("Value not found") } - return c.setConfigElement(key.Name, value) + return nil } -func (c *ConfigParser) setConfigElement(key string, value *ast.BasicLit) error { +func (c *ConfigParser) setConfigElement(key string, value ast.Expr) error { config := reflect.ValueOf(c.config) kind := config.Kind() @@ -106,7 +108,7 @@ func (c *ConfigParser) setConfigElement(key string, value *ast.BasicLit) error { return nil } -func (c *ConfigParser) setConfigElementField(key string, value *ast.BasicLit, config reflect.Value, i int, vt reflect.Type) error { +func (c *ConfigParser) setConfigElementField(key string, value ast.Expr, config reflect.Value, i int, vt reflect.Type) error { if vt.Field(i).Name != key { return nil } @@ -120,6 +122,8 @@ func (c *ConfigParser) setConfigElementField(key string, value *ast.BasicLit, co c.setConfigFieldToString(uv, value) case reflect.Int: c.setConfigFieldToInt(uv, value) + case reflect.Bool: + c.setConfigFieldToBool(uv, value) } return nil } @@ -131,7 +135,15 @@ func unpackValue(v reflect.Value) reflect.Value { return v } -func (c *ConfigParser) setConfigFieldToString(uv reflect.Value, value *ast.BasicLit) error { +func (c *ConfigParser) setConfigFieldToString(uv reflect.Value, v ast.Expr) error { + switch v.(type) { + case *ast.BasicLit: + default: + return errors.New("Not string") + } + + value := v.(*ast.BasicLit) + if value.Kind != token.STRING { return errors.New("Not string") } @@ -143,7 +155,15 @@ func (c *ConfigParser) setConfigFieldToString(uv reflect.Value, value *ast.Basic return nil } -func (c *ConfigParser) setConfigFieldToInt(uv reflect.Value, value *ast.BasicLit) error { +func (c *ConfigParser) setConfigFieldToInt(uv reflect.Value, v ast.Expr) error { + switch v.(type) { + case *ast.BasicLit: + default: + return errors.New("Not int") + } + + value := v.(*ast.BasicLit) + if value.Kind != token.INT { return errors.New("Not int") } @@ -154,3 +174,24 @@ func (c *ConfigParser) setConfigFieldToInt(uv reflect.Value, value *ast.BasicLit uv.SetInt(int64(num)) return nil } + +func (c *ConfigParser) setConfigFieldToBool(uv reflect.Value, v ast.Expr) error { + switch v.(type) { + case *ast.Ident: + default: + return errors.New("Not bool") + } + + value := v.(*ast.Ident) + + switch value.Name { + case "true": + uv.SetBool(true) + case "false": + uv.SetBool(false) + default: + return errors.New("Not bool") + } + + return nil +} diff --git a/goconf_test.go b/goconf_test.go index ddddaba..35dc888 100644 --- a/goconf_test.go +++ b/goconf_test.go @@ -17,18 +17,22 @@ func TestUtils(t *testing.T) { } type Config struct { - Host string - Port int - Params string - IntParam int + Host string + Port int + Params string + IntParam int + BoolParamTrue bool + BoolParamFalse bool } var config = Config{ Host: "testhost", Port: 19, - Params: "some params", - IntParam: 199, + Params: "some params", + IntParam: 199, + BoolParamTrue: true, + BoolParamFalse: false, } var _ = Describe("Lib", func() { @@ -42,6 +46,8 @@ var _ = Describe("Lib", func() { Ω(c.Port).To(Be(19)) Ω(c.Params).To(Be("some params")) Ω(c.IntParam).To(Be(199)) + Ω(c.BoolParamTrue).To(BeTrue()) + Ω(c.BoolParamFalse).To(BeFalse()) }) }) })