diff options
author | Runxi Yu <me@runxiyu.org> | 2025-04-05 22:18:24 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-04-05 22:19:40 +0800 |
commit | f11775b3d292b1b119f7198d7e565749a4b9c847 (patch) | |
tree | a06c4ed6dfef919290af32d63683266377fc5f18 /internal/scfg/scfg.go | |
parent | Unexport some other things (diff) | |
download | forge-f11775b3d292b1b119f7198d7e565749a4b9c847.tar.gz forge-f11775b3d292b1b119f7198d7e565749a4b9c847.tar.zst forge-f11775b3d292b1b119f7198d7e565749a4b9c847.zip |
Move scfg into the repo and don't error out on unknown fields
Diffstat (limited to '')
-rw-r--r-- | internal/scfg/scfg.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/internal/scfg/scfg.go b/internal/scfg/scfg.go new file mode 100644 index 0000000..4533e63 --- /dev/null +++ b/internal/scfg/scfg.go @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: Copyright (c) 2020 Simon Ser <https://emersion.fr> + +// Package scfg parses and formats configuration files. +// Note that this fork of scfg behaves differently from upstream scfg. +package scfg + +import ( + "fmt" +) + +// Block is a list of directives. +type Block []*Directive + +// GetAll returns a list of directives with the provided name. +func (blk Block) GetAll(name string) []*Directive { + l := make([]*Directive, 0, len(blk)) + for _, child := range blk { + if child.Name == name { + l = append(l, child) + } + } + return l +} + +// Get returns the first directive with the provided name. +func (blk Block) Get(name string) *Directive { + for _, child := range blk { + if child.Name == name { + return child + } + } + return nil +} + +// Directive is a configuration directive. +type Directive struct { + Name string + Params []string + + Children Block + + lineno int +} + +// ParseParams extracts parameters from the directive. It errors out if the +// user hasn't provided enough parameters. +func (d *Directive) ParseParams(params ...*string) error { + if len(d.Params) < len(params) { + return fmt.Errorf("directive %q: want %v params, got %v", d.Name, len(params), len(d.Params)) + } + for i, ptr := range params { + if ptr == nil { + continue + } + *ptr = d.Params[i] + } + return nil +} |