From 7743836d53bd0f3b5050ca19f515b0366f5250e3 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Mon, 22 Dec 2025 09:30:38 -0800 Subject: [PATCH] Simplify config: flags for settings, dots-only for addresses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move listen_port and broadcast_addr from TOML to CLI flags - Remove colon format support for universe addresses (dots only) - Config file now contains only mappings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- config.example.toml | 9 ++---- config/config.go | 67 ++++++++++++--------------------------------- main.go | 10 ++++--- 3 files changed, 26 insertions(+), 60 deletions(-) diff --git a/config.example.toml b/config.example.toml index 6f22966..72cb401 100644 --- a/config.example.toml +++ b/config.example.toml @@ -1,14 +1,9 @@ # artmap configuration +# Run with: go run . -config config.toml [-port 6454] [-broadcast 2.255.255.255] -[settings] -listen_port = 6454 # ArtNet port (default: 6454) -broadcast_addr = "2.255.255.255" # ArtNet broadcast address - -# Universe address formats supported: +# Universe address formats: # "0.0.1" - Net.Subnet.Universe -# "0:0:1" - Net:Subnet:Universe # 1 - Universe number only (net=0, subnet=0) -# "1" - Universe number as string # Example: Remap entire universe # Maps all 512 channels from universe 0 to universe 5 diff --git a/config/config.go b/config/config.go index 17c4411..b363c87 100644 --- a/config/config.go +++ b/config/config.go @@ -11,16 +11,9 @@ import ( // Config represents the application configuration type Config struct { - Settings Settings `toml:"settings"` Mappings []Mapping `toml:"mapping"` } -// Settings contains global configuration options -type Settings struct { - ListenPort int `toml:"listen_port"` - BroadcastAddr string `toml:"broadcast_addr"` -} - // Mapping represents a single channel mapping rule type Mapping struct { // Source @@ -72,9 +65,8 @@ func (u *UniverseAddr) UnmarshalTOML(data interface{}) error { } } -// ParseUniverseAddr parses various universe address formats: -// - "0.0.1" or "0.0.1" - Net.Subnet.Universe -// - "0:0:1" - Net:Subnet:Universe +// ParseUniverseAddr parses universe address formats: +// - "0.0.1" - Net.Subnet.Universe // - "1" - Universe number only func ParseUniverseAddr(s string) (artnet.Universe, error) { s = strings.TrimSpace(s) @@ -82,44 +74,25 @@ func ParseUniverseAddr(s string) (artnet.Universe, error) { // Try Net.Subnet.Universe format if strings.Contains(s, ".") { parts := strings.Split(s, ".") - if len(parts) == 3 { - net, err := strconv.Atoi(parts[0]) - if err != nil { - return 0, fmt.Errorf("invalid net: %w", err) - } - subnet, err := strconv.Atoi(parts[1]) - if err != nil { - return 0, fmt.Errorf("invalid subnet: %w", err) - } - universe, err := strconv.Atoi(parts[2]) - if err != nil { - return 0, fmt.Errorf("invalid universe: %w", err) - } - return artnet.NewUniverse(uint8(net), uint8(subnet), uint8(universe)), nil + if len(parts) != 3 { + return 0, fmt.Errorf("invalid universe address format: %s (expected net.subnet.universe)", s) } + net, err := strconv.Atoi(parts[0]) + if err != nil { + return 0, fmt.Errorf("invalid net: %w", err) + } + subnet, err := strconv.Atoi(parts[1]) + if err != nil { + return 0, fmt.Errorf("invalid subnet: %w", err) + } + universe, err := strconv.Atoi(parts[2]) + if err != nil { + return 0, fmt.Errorf("invalid universe: %w", err) + } + return artnet.NewUniverse(uint8(net), uint8(subnet), uint8(universe)), nil } - // Try Net:Subnet:Universe format - if strings.Contains(s, ":") { - parts := strings.Split(s, ":") - if len(parts) == 3 { - net, err := strconv.Atoi(parts[0]) - if err != nil { - return 0, fmt.Errorf("invalid net: %w", err) - } - subnet, err := strconv.Atoi(parts[1]) - if err != nil { - return 0, fmt.Errorf("invalid subnet: %w", err) - } - universe, err := strconv.Atoi(parts[2]) - if err != nil { - return 0, fmt.Errorf("invalid universe: %w", err) - } - return artnet.NewUniverse(uint8(net), uint8(subnet), uint8(universe)), nil - } - } - - // Try plain universe number + // Plain universe number u, err := strconv.Atoi(s) if err != nil { return 0, fmt.Errorf("invalid universe address format: %s", s) @@ -131,10 +104,6 @@ func ParseUniverseAddr(s string) (artnet.Universe, error) { func Load(path string) (*Config, error) { var cfg Config - // Set defaults - cfg.Settings.ListenPort = artnet.Port - cfg.Settings.BroadcastAddr = "2.255.255.255" - if _, err := toml.DecodeFile(path, &cfg); err != nil { return nil, fmt.Errorf("failed to load config: %w", err) } diff --git a/main.go b/main.go index 66779e4..2b19dc7 100644 --- a/main.go +++ b/main.go @@ -24,6 +24,8 @@ type App struct { func main() { configPath := flag.String("config", "config.toml", "path to config file") + listenPort := flag.Int("port", artnet.Port, "ArtNet listen port") + broadcastAddr := flag.String("broadcast", "2.255.255.255", "ArtNet broadcast address") flag.Parse() // Load config @@ -49,7 +51,7 @@ func main() { } // Create sender - sender, err := artnet.NewSender(cfg.Settings.BroadcastAddr) + sender, err := artnet.NewSender(*broadcastAddr) if err != nil { log.Fatalf("failed to create sender: %v", err) } @@ -68,7 +70,7 @@ func main() { } // Create receiver - receiver, err := artnet.NewReceiver(cfg.Settings.ListenPort, app) + receiver, err := artnet.NewReceiver(*listenPort, app) if err != nil { log.Fatalf("failed to create receiver: %v", err) } @@ -78,8 +80,8 @@ func main() { receiver.Start() discovery.Start() - log.Printf("listening on port %d", cfg.Settings.ListenPort) - log.Printf("broadcasting to %s", cfg.Settings.BroadcastAddr) + log.Printf("listening on port %d", *listenPort) + log.Printf("broadcasting to %s", *broadcastAddr) // Wait for interrupt sigChan := make(chan os.Signal, 1)