Simplify config: flags for settings, dots-only for addresses
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
10
main.go
10
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)
|
||||
|
||||
Reference in New Issue
Block a user