From 272534584376c81116db5199fd2e4216e3698192 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 5 Apr 2025 22:22:46 +0800 Subject: scfg: Error out when required directives are missing --- config.go | 2 -- internal/scfg/unmarshal.go | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/config.go b/config.go index 2158721..abb71dd 100644 --- a/config.go +++ b/config.go @@ -69,8 +69,6 @@ type Config struct { // it to the global [config] struct. This may race with concurrent reads from // [config]; additional synchronization is necessary if the configuration is to // be made reloadable. -// -// TODO: Error out when there are missing fields func (s *Server) LoadConfig(path string) (err error) { var configFile *os.File if configFile, err = os.Open(path); err != nil { 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) } -- cgit v1.2.3