diff options
Diffstat (limited to 'internal/scfg')
-rw-r--r-- | internal/scfg/unmarshal.go | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/internal/scfg/unmarshal.go b/internal/scfg/unmarshal.go index 19f3dae..e9e1a52 100644 --- a/internal/scfg/unmarshal.go +++ b/internal/scfg/unmarshal.go @@ -107,12 +107,15 @@ func (dec *Decoder) unmarshalBlock(block Block, v reflect.Value) error { } v.SetMapIndex(reflect.ValueOf(name), mv) } + case reflect.Struct: si, err := getStructInfo(t) if err != nil { return err } + seen := make(map[int]bool) + for name, dirs := range dirsByName { fieldIndex, ok := si.children[name] if !ok { @@ -123,7 +126,18 @@ func (dec *Decoder) unmarshalBlock(block Block, v reflect.Value) error { if err := dec.unmarshalDirectiveList(dirs, fv); err != nil { return err } + seen[fieldIndex] = true + } + + for name, fieldIndex := range si.children { + if fieldIndex == si.param { + continue + } + if _, ok := seen[fieldIndex]; !ok { + return fmt.Errorf("scfg: missing required directive %q", name) + } } + default: return fmt.Errorf("scfg: unsupported type for unmarshaling blocks: %v", t) } |