aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-04-05 22:22:46 +0800
committerRunxi Yu <me@runxiyu.org>2025-04-05 22:23:09 +0800
commit272534584376c81116db5199fd2e4216e3698192 (patch)
tree72fdac8c31f0d92e77f407f3cf7f9991cdb8724c
parentMove scfg into the repo and don't error out on unknown fields (diff)
downloadforge-0.1.25.tar.gz
forge-0.1.25.tar.zst
forge-0.1.25.zip
scfg: Error out when required directives are missingv0.1.25
-rw-r--r--config.go2
-rw-r--r--internal/scfg/unmarshal.go14
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)
}