aboutsummaryrefslogtreecommitdiff
path: root/internal/scfg/writer.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-04-06 09:26:46 +0800
committerRunxi Yu <me@runxiyu.org>2025-04-06 09:27:53 +0800
commitda1d8f4e7c332c7109427915e6459b10209cedce (patch)
tree280b921be3b51f93d82d916b4eaa89387b7102cc /internal/scfg/writer.go
parentgit2c, git2d: Rename cmd1 and cmd2 descriptively (diff)
downloadforge-0.1.32.tar.gz
forge-0.1.32.tar.zst
forge-0.1.32.zip
Move the Go stuff to ./forged/v0.1.32
Diffstat (limited to 'internal/scfg/writer.go')
-rw-r--r--internal/scfg/writer.go112
1 files changed, 0 insertions, 112 deletions
diff --git a/internal/scfg/writer.go b/internal/scfg/writer.go
deleted file mode 100644
index 02a07fe..0000000
--- a/internal/scfg/writer.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// SPDX-License-Identifier: MIT
-// SPDX-FileCopyrightText: Copyright (c) 2020 Simon Ser <https://emersion.fr>
-
-package scfg
-
-import (
- "errors"
- "io"
- "strings"
-)
-
-var errDirEmptyName = errors.New("scfg: directive with empty name")
-
-// Write writes a parsed configuration to the provided io.Writer.
-func Write(w io.Writer, blk Block) error {
- enc := newEncoder(w)
- err := enc.encodeBlock(blk)
- return err
-}
-
-// encoder write SCFG directives to an output stream.
-type encoder struct {
- w io.Writer
- lvl int
- err error
-}
-
-// newEncoder returns a new encoder that writes to w.
-func newEncoder(w io.Writer) *encoder {
- return &encoder{w: w}
-}
-
-func (enc *encoder) push() {
- enc.lvl++
-}
-
-func (enc *encoder) pop() {
- enc.lvl--
-}
-
-func (enc *encoder) writeIndent() {
- for i := 0; i < enc.lvl; i++ {
- enc.write([]byte("\t"))
- }
-}
-
-func (enc *encoder) write(p []byte) {
- if enc.err != nil {
- return
- }
- _, enc.err = enc.w.Write(p)
-}
-
-func (enc *encoder) encodeBlock(blk Block) error {
- for _, dir := range blk {
- if err := enc.encodeDir(*dir); err != nil {
- return err
- }
- }
- return enc.err
-}
-
-func (enc *encoder) encodeDir(dir Directive) error {
- if enc.err != nil {
- return enc.err
- }
-
- if dir.Name == "" {
- enc.err = errDirEmptyName
- return enc.err
- }
-
- enc.writeIndent()
- enc.write([]byte(maybeQuote(dir.Name)))
- for _, p := range dir.Params {
- enc.write([]byte(" "))
- enc.write([]byte(maybeQuote(p)))
- }
-
- if len(dir.Children) > 0 {
- enc.write([]byte(" {\n"))
- enc.push()
- if err := enc.encodeBlock(dir.Children); err != nil {
- return err
- }
- enc.pop()
-
- enc.writeIndent()
- enc.write([]byte("}"))
- }
- enc.write([]byte("\n"))
-
- return enc.err
-}
-
-const specialChars = "\"\\\r\n'{} \t"
-
-func maybeQuote(s string) string {
- if s == "" || strings.ContainsAny(s, specialChars) {
- var sb strings.Builder
- sb.WriteByte('"')
- for _, ch := range s {
- if strings.ContainsRune(`"\`, ch) {
- sb.WriteByte('\\')
- }
- sb.WriteRune(ch)
- }
- sb.WriteByte('"')
- return sb.String()
- }
- return s
-}