Skip to content

Commit

Permalink
Slightly changed _ref directive syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
iph0 committed Oct 19, 2018
1 parent 188f0d9 commit 2449044
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 38 deletions.
39 changes: 21 additions & 18 deletions conf.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ const (
)

var (
_ref = reflect.ValueOf("_ref")
_name = reflect.ValueOf("_name")
_firstDefined = reflect.ValueOf("_firstDefined")
_default = reflect.ValueOf("_default")
_include = reflect.ValueOf("_include")
refKey = reflect.ValueOf("_ref")
nameKey = reflect.ValueOf("name")
firstDefKey = reflect.ValueOf("firstDefined")
defaultKey = reflect.ValueOf("default")

includeKey = reflect.ValueOf("_include")
)

// Processor loads configuration layers from different sources and merges them
Expand Down Expand Up @@ -321,15 +322,15 @@ func (p *Processor) processNode(node reflect.Value) (reflect.Value, error) {

return reflect.ValueOf(str), nil
case reflect.Map:
if data := node.MapIndex(_ref); data.IsValid() {
if data := node.MapIndex(refKey); data.IsValid() {
node, err := p.processRef(data)

if err != nil {
return reflect.Value{}, err
}

return node, nil
} else if locators := node.MapIndex(_include); locators.IsValid() {
} else if locators := node.MapIndex(includeKey); locators.IsValid() {
node, err := p.processInc(locators)

if err != nil {
Expand Down Expand Up @@ -416,12 +417,14 @@ func (p *Processor) processRef(data reflect.Value) (reflect.Value, error) {

return node, nil
case reflect.Map:
if name := data.MapIndex(_name); name.IsValid() {
if name := data.MapIndex(nameKey); name.IsValid() {
name = reveal(name)
nameKind := name.Kind()

if name.Kind() != reflect.String {
if nameKind != reflect.String {
return reflect.Value{},
fmt.Errorf("%s: invalid _name sub-directive", errPref)
fmt.Errorf("%s: reference name must be of type string, but has "+
"type %s", errPref, nameKind)
}

nameStr := name.Interface().(string)
Expand All @@ -434,13 +437,14 @@ func (p *Processor) processRef(data reflect.Value) (reflect.Value, error) {
if node.IsValid() {
return node, nil
}
} else if names := data.MapIndex(_firstDefined); names.IsValid() {
} else if names := data.MapIndex(firstDefKey); names.IsValid() {
names = reveal(names)
namesKind := names.Kind()

if names.Kind() != reflect.Slice {
if namesKind != reflect.Slice {
return reflect.Value{},
fmt.Errorf("%s: invalid _firstDefined sub-directive",
errPref)
fmt.Errorf("%s: firstDefined list must be of type slice, but has "+
"type %s", errPref, namesKind)
}

namesLen := names.Len()
Expand All @@ -451,9 +455,8 @@ func (p *Processor) processRef(data reflect.Value) (reflect.Value, error) {

if name.Kind() != reflect.String {
return reflect.Value{},
fmt.Errorf("%s: reference name in _firstDefined sub-directive must"+
" be of type string, but has type %s", errPref,
name.Type())
fmt.Errorf("%s: reference name in firstDefined list must be of "+
"type string, but has type %s", errPref, name.Type())
}

nameStr := name.Interface().(string)
Expand All @@ -469,7 +472,7 @@ func (p *Processor) processRef(data reflect.Value) (reflect.Value, error) {
}
}

if node := data.MapIndex(_default); node.IsValid() {
if node := data.MapIndex(defaultKey); node.IsValid() {
return node, nil
}
default:
Expand Down
26 changes: 13 additions & 13 deletions conf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ func TestErrors(t *testing.T) {

if err == nil {
t.Error("no error happened")
} else if strings.Index(err.Error(), "invalid _name sub-directive") == -1 {
} else if strings.Index(err.Error(), "reference name must be of type") == -1 {
t.Error("other error happened:", err)
}
},
Expand All @@ -302,7 +302,7 @@ func TestErrors(t *testing.T) {

if err == nil {
t.Error("no error happened")
} else if strings.Index(err.Error(), "invalid _firstDefined sub-directive") == -1 {
} else if strings.Index(err.Error(), "firstDefined list must be of type") == -1 {
t.Error("other error happened:", err)
}
},
Expand All @@ -314,7 +314,7 @@ func TestErrors(t *testing.T) {

if err == nil {
t.Error("no error happened")
} else if strings.Index(err.Error(), "reference name in _firstDefined") == -1 {
} else if strings.Index(err.Error(), "reference name in firstDefined") == -1 {
t.Error("other error happened:", err)
}
},
Expand Down Expand Up @@ -447,15 +447,15 @@ func NewLoader() conf.Loader {

"paramS": conf.M{
"_ref": conf.M{
"_name": "paramX",
"_default": "bar:valS",
"name": "paramX",
"default": "bar:valS",
},
},

"paramT": conf.M{
"_ref": conf.M{
"_firstDefined": conf.S{"paramX", "paramY"},
"_default": "bar:valT",
"firstDefined": conf.S{"paramX", "paramY"},
"default": "bar:valT",
},
},

Expand Down Expand Up @@ -498,22 +498,22 @@ func NewLoader() conf.Loader {

"invalid_ref_name": conf.M{
"_ref": conf.M{
"_name": 42,
"_default": "foo",
"name": 42,
"default": "foo",
},
},

"invalid_ref_first_defined": conf.M{
"_ref": conf.M{
"_firstDefined": 42,
"_default": "bar:valT",
"firstDefined": 42,
"default": "bar:valT",
},
},

"invalid_ref_first_defined_argument": conf.M{
"_ref": conf.M{
"_firstDefined": conf.S{42},
"_default": "bar:valT",
"firstDefined": conf.S{42},
"default": "bar:valT",
},
},

Expand Down
8 changes: 4 additions & 4 deletions doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ and assigns this value to another configuration parameter. _ref directive can
take three forms:
_ref: <name>
_ref: {_name: <name>, _default: <value>}
_ref: {_firstDefined: [<name1>, ...], _default: <value>}
_ref: {name: <name>, default: <value>}
_ref: {firstDefined: [<name1>, ...], default: <value>}
In the first form _ref directive just assings a value retrieved by reference.
In the second form _ref directive tries to retrieve a value by reference and, if
Expand All @@ -88,7 +88,7 @@ omitted. Reference names in _ref directive can be relative or absolute.
dbname: "stat"
username: "stat"
password:
_ref: {_name: "MYAPP_DB_STAT_PASSWORD", _default: "stat_pass"}
_ref: {name: "MYAPP_DB_STAT_PASSWORD", default: "stat_pass"}
options: {_ref: "db.defaultOptions"}
metrics:
Expand All @@ -97,7 +97,7 @@ omitted. Reference names in _ref directive can be relative or absolute.
dbname: "metrics"
username: "metrics"
password:
_ref: {_name: "MYAPP_DB_METRICS_PASSWORD", _default: "metrics_pass"}
_ref: {name: "MYAPP_DB_METRICS_PASSWORD", default: "metrics_pass"}
options: {_ref: "...defaultOptions"}
_include directive loads configuration layer from external sources and inserts
Expand Down
4 changes: 2 additions & 2 deletions examples/etc/connectors.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ dbname = "stat"
username = "stat"
options = {_ref = "db.defaultOptions"}
[stat.password]
_ref = {_name = "MYAPP_DB_STAT_PASSWORD", _default = "stat_pass"}
_ref = {name = "MYAPP_DB_STAT_PASSWORD", default = "stat_pass"}

[metrics]
host = "metrics.mydb.com"
Expand All @@ -14,4 +14,4 @@ dbname = "metrics"
username = "metrics"
options = {_ref = "...defaultOptions"}
[metrics.password]
_ref = {_name = "MYAPP_DB_METRICS_PASSWORD", _default = "metrics_pass"}
_ref = {name = "MYAPP_DB_METRICS_PASSWORD", default = "metrics_pass"}
2 changes: 1 addition & 1 deletion examples/etc/myapp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ myapp:
mediaFormats: ["images", "audio", "video"]

dirs:
rootDir: {_ref: {_name: "MYAPP_ROOTDIR", _default: "/usr/local/myapp"}}
rootDir: {_ref: {name: "MYAPP_ROOTDIR", default: "/usr/local/myapp"}}
templatesDir: "${myapp.dirs.rootDir}/templates"
sessionsDir: "${.rootDir}/sessions"

Expand Down

0 comments on commit 2449044

Please sign in to comment.