builder/common: extract out decode config
This commit is contained in:
parent
b2397f4fb1
commit
e84669aa37
|
@ -10,7 +10,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/mitchellh/goamz/aws"
|
"github.com/mitchellh/goamz/aws"
|
||||||
"github.com/mitchellh/goamz/ec2"
|
"github.com/mitchellh/goamz/ec2"
|
||||||
"github.com/mitchellh/mapstructure"
|
|
||||||
"github.com/mitchellh/multistep"
|
"github.com/mitchellh/multistep"
|
||||||
"github.com/mitchellh/packer/builder/common"
|
"github.com/mitchellh/packer/builder/common"
|
||||||
"github.com/mitchellh/packer/packer"
|
"github.com/mitchellh/packer/packer"
|
||||||
|
@ -53,24 +52,11 @@ type Builder struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Builder) Prepare(raws ...interface{}) error {
|
func (b *Builder) Prepare(raws ...interface{}) error {
|
||||||
var md mapstructure.Metadata
|
md, err := common.DecodeConfig(&b.config, raws...)
|
||||||
decoderConfig := &mapstructure.DecoderConfig{
|
|
||||||
Metadata: &md,
|
|
||||||
Result: &b.config,
|
|
||||||
}
|
|
||||||
|
|
||||||
decoder, err := mapstructure.NewDecoder(decoderConfig)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, raw := range raws {
|
|
||||||
err := decoder.Decode(raw)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Accumulate any errors
|
// Accumulate any errors
|
||||||
errs := make([]error, 0)
|
errs := make([]error, 0)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DecodeConfig is a helper that handles decoding raw configuration using
|
||||||
|
// mapstructure. It returns the metadata and any errors that may happen.
|
||||||
|
// If you need extra configuration for mapstructure, you should configure
|
||||||
|
// it manually and not use this helper function.
|
||||||
|
func DecodeConfig(target interface{}, raws ...interface{}) (*mapstructure.Metadata, error) {
|
||||||
|
var md mapstructure.Metadata
|
||||||
|
decoderConfig := &mapstructure.DecoderConfig{
|
||||||
|
Metadata: &md,
|
||||||
|
Result: target,
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder, err := mapstructure.NewDecoder(decoderConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, raw := range raws {
|
||||||
|
err := decoder.Decode(raw)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &md, nil
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDecodeConfig(t *testing.T) {
|
||||||
|
type Local struct {
|
||||||
|
Foo string
|
||||||
|
Bar string
|
||||||
|
}
|
||||||
|
|
||||||
|
raws := []interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"bar": "baz",
|
||||||
|
"baz": "what",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var result Local
|
||||||
|
md, err := DecodeConfig(&result, raws...)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.Foo != "bar" {
|
||||||
|
t.Fatalf("invalid: %#v", result.Foo)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.Bar != "baz" {
|
||||||
|
t.Fatalf("invalid: %#v", result.Bar)
|
||||||
|
}
|
||||||
|
|
||||||
|
if md == nil {
|
||||||
|
t.Fatal("metadata should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(md.Unused, []string{"baz"}) {
|
||||||
|
t.Fatalf("unused: %#v", md.Unused)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue