small pixel drawing of a pufferfish cascade

agent/config.go

package agent

import (
	"fmt"
	"net"
	"os"

	"golang.org/x/exp/slog"
)

const DefaultBindPort int = 4440

func DefaultConfig() *Config {
	hostname, err := os.Hostname()
	if err != nil {
		panic(err)
	}

	return &Config{
		BindAddr:   "0.0.0.0",
		ClientAddr: "0.0.0.0",
		LogLevel:   "INFO",
		NodeName:   hostname,
	}
}

// Services are built on top of serf
// tags. The tag format under the hood
// is service=name=<name>,port=<port>
type Service struct {
	name string
	port int
}

type Config struct {
	BindAddr   string
	ClientAddr string
	LogLevel   string
	NodeName   string
	StartJoin  []string
	Services   []Service
}

// lifted from serf, could be simplified
func (c *Config) AddrParts(address string) (string, int, error) {
	checkAddr := address

START:
	_, _, err := net.SplitHostPort(checkAddr)
	if ae, ok := err.(*net.AddrError); ok && ae.Err == "missing port in address" {
		checkAddr = fmt.Sprintf("%s:%d", checkAddr, DefaultBindPort)
		goto START
	}
	if err != nil {
		return "", 0, err
	}

	// Get the address
	addr, err := net.ResolveTCPAddr("tcp", checkAddr)
	if err != nil {
		return "", 0, err
	}

	return addr.IP.String(), addr.Port, nil
}

func (c *Config) GetLogLevel() slog.Level {
	var lvl slog.Level
	if c.LogLevel == "DEBUG" {
		lvl = slog.LevelDebug
	}
	if c.LogLevel == "INFO" {
		lvl = slog.LevelInfo
	}
	if c.LogLevel == "WARN" || c.LogLevel == "WARNING" {
		lvl = slog.LevelWarn
	}
	if c.LogLevel == "ERR" || c.LogLevel == "ERROR" {
		lvl = slog.LevelError
	}
	return lvl
}