Lindenii Project Forge
Login

server

Lindenii Forge’s main backend daemon
Commit info
ID
a52b8333025124f9f52943e6046a29dc5f645662
Author
Runxi Yu <me@runxiyu.org>
Author date
Sun, 17 Aug 2025 13:55:31 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Sun, 17 Aug 2025 13:55:31 +0800
Actions
Lint config
package config

import (
	"bufio"
	"fmt"
	"log/slog"
	"os"

	"go.lindenii.runxiyu.org/forge/forged/internal/common/scfg"
	"go.lindenii.runxiyu.org/forge/forged/internal/database"
	"go.lindenii.runxiyu.org/forge/forged/internal/incoming/hooks"
	"go.lindenii.runxiyu.org/forge/forged/internal/incoming/lmtp"
	"go.lindenii.runxiyu.org/forge/forged/internal/incoming/ssh"
	"go.lindenii.runxiyu.org/forge/forged/internal/incoming/web"
	"go.lindenii.runxiyu.org/forge/forged/internal/ipc/irc"
)

type Config struct {
	DB    database.Config `scfg:"db"`
	Web   web.Config      `scfg:"web"`
	Hooks hooks.Config    `scfg:"hooks"`
	LMTP  lmtp.Config     `scfg:"lmtp"`
	SSH   ssh.Config      `scfg:"ssh"`
	IRC   irc.Config      `scfg:"irc"`
	Git   struct {
		RepoDir    string `scfg:"repo_dir"`
		Socket     string `scfg:"socket"`
		DaemonPath string `scfg:"daemon_path"`
	} `scfg:"git"`
	General struct {
		Title string `scfg:"title"`
	} `scfg:"general"`
	Pprof struct {
		Net  string `scfg:"net"`
		Addr string `scfg:"addr"`
	} `scfg:"pprof"`
}

func Open(path string) (config Config, err error) {
	var configFile *os.File

	if configFile, err = os.Open(path); err != nil {
	configFile, err = os.Open(path) //#nosec G304
	if err != nil {
		err = fmt.Errorf("open config file: %w", err)
		return config, err
	}
	defer configFile.Close()
	defer func() {
		_ = configFile.Close()
	}()

	decoder := scfg.NewDecoder(bufio.NewReader(configFile))
	if err = decoder.Decode(&config); err != nil {
	err = decoder.Decode(&config)
	if err != nil {
		err = fmt.Errorf("decode config file: %w", err)
		return config, err
	}
	for _, u := range decoder.UnknownDirectives() {
		slog.Warn("unknown configuration directive", "directive", u)
	}

	return config, err
}