diff --git a/cmd/example-mdns/main.go b/cmd/example-mdns/main.go
index 1ac3c8f..818922e 100644
--- a/cmd/example-mdns/main.go
+++ b/cmd/example-mdns/main.go
@@ -1,3 +1,4 @@
+// Package main provides an example of discovering SoundTouch devices using mDNS.
package main
import (
diff --git a/cmd/example-upnp/main.go b/cmd/example-upnp/main.go
index 48f44aa..dbdc15e 100644
--- a/cmd/example-upnp/main.go
+++ b/cmd/example-upnp/main.go
@@ -1,3 +1,4 @@
+// Package main provides an example of discovering SoundTouch devices using UPnP.
package main
import (
diff --git a/cmd/soundtouch-cli/main.go b/cmd/soundtouch-cli/main.go
index f26be07..8520ffd 100644
--- a/cmd/soundtouch-cli/main.go
+++ b/cmd/soundtouch-cli/main.go
@@ -1,3 +1,4 @@
+// Package main provides a command-line interface for controlling Bose SoundTouch devices.
package main
import (
@@ -1640,9 +1641,9 @@ func handleClockCommands(host string, port int, timeout time.Duration, getClockT
// Get clock time
if getClockTime {
fmt.Printf("Getting clock time from %s:%d...\n", host, port)
- clockTime, err := soundtouchClient.GetClockTime()
- if err != nil {
- return fmt.Errorf("failed to get clock time: %w", err)
+ clockTime, clockErr := soundtouchClient.GetClockTime()
+ if clockErr != nil {
+ return fmt.Errorf("failed to get clock time: %w", clockErr)
}
fmt.Printf("Device Clock Time:\n")
@@ -1686,9 +1687,9 @@ func handleClockCommands(host string, port int, timeout time.Duration, getClockT
// Get clock display settings
if getClockDisplay {
fmt.Printf("Getting clock display settings from %s:%d...\n", host, port)
- clockDisplay, err := soundtouchClient.GetClockDisplay()
- if err != nil {
- return fmt.Errorf("failed to get clock display settings: %w", err)
+ clockDisplay, displayErr := soundtouchClient.GetClockDisplay()
+ if displayErr != nil {
+ return fmt.Errorf("failed to get clock display settings: %w", displayErr)
}
fmt.Printf("Clock Display Settings:\n")
diff --git a/cmd/websocket-demo/main.go b/cmd/websocket-demo/main.go
index 175be11..1226474 100644
--- a/cmd/websocket-demo/main.go
+++ b/cmd/websocket-demo/main.go
@@ -1,10 +1,10 @@
+// Package main provides a demonstration of WebSocket event handling for Bose SoundTouch devices.
package main
import (
"context"
"flag"
"fmt"
- "log"
"net"
"os"
"os/signal"
@@ -101,13 +101,13 @@ func main() {
discoveryService := discovery.NewUnifiedDiscoveryService(cfg)
devices, err := discoveryService.DiscoverDevices(ctx)
if err != nil {
- cancel()
- log.Fatalf("Discovery failed: %v", err)
+ fmt.Printf("Discovery failed: %v\n", err)
+ return
}
if len(devices) == 0 {
fmt.Println("No SoundTouch devices found")
- os.Exit(1)
+ return
}
// Use first discovered device
@@ -136,7 +136,8 @@ func main() {
fmt.Println("Testing device connectivity...")
deviceInfo, err := soundTouchClient.GetDeviceInfo()
if err != nil {
- log.Fatalf("Failed to connect to device: %v", err)
+ fmt.Printf("Failed to connect to device: %v\n", err)
+ return
}
macAddress := ""
if len(deviceInfo.NetworkInfo) > 0 {
@@ -172,7 +173,8 @@ func main() {
fmt.Println("Connecting to WebSocket...")
err = wsClient.ConnectWithConfig(wsConfig)
if err != nil {
- log.Fatalf("Failed to connect to WebSocket: %v", err)
+ fmt.Printf("Failed to connect to WebSocket: %v\n", err)
+ return
}
fmt.Println("Connected! Listening for events...")
diff --git a/pkg/client/balance_test.go b/pkg/client/balance_test.go
index 6e20b0a..4ec0d83 100644
--- a/pkg/client/balance_test.go
+++ b/pkg/client/balance_test.go
@@ -82,7 +82,7 @@ func TestClient_GetBalance(t *testing.T) {
}
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(tt.serverResponse))
+ _, _ = w.Write([]byte(tt.serverResponse))
}))
defer server.Close()
@@ -345,7 +345,7 @@ func TestClient_IncreaseBalance(t *testing.T) {
fmt.Sprintf("%d", tt.expectedNewBalance) + ``
}
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.Method == "POST" && r.URL.Path == "/balance" {
postCallCount++
w.WriteHeader(http.StatusOK)
@@ -432,7 +432,7 @@ func TestClient_DecreaseBalance(t *testing.T) {
fmt.Sprintf("%d", tt.expectedNewBalance) + ``
}
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.Method == "POST" && r.URL.Path == "/balance" {
postCallCount++
w.WriteHeader(http.StatusOK)
@@ -481,7 +481,7 @@ func TestClient_Balance_ErrorHandling(t *testing.T) {
name: "GetBalance server returns 404",
serverResponse: func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusNotFound)
- w.Write([]byte("Not Found"))
+ _, _ = w.Write([]byte("Not Found"))
},
method: func(c *Client) error {
_, err := c.GetBalance()
@@ -494,7 +494,7 @@ func TestClient_Balance_ErrorHandling(t *testing.T) {
name: "SetBalance server returns 500",
serverResponse: func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
},
method: func(c *Client) error {
return c.SetBalance(15)
@@ -506,7 +506,7 @@ func TestClient_Balance_ErrorHandling(t *testing.T) {
name: "GetBalance invalid XML response",
serverResponse: func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
- w.Write([]byte("invalid xml"))
+ _, _ = w.Write([]byte("invalid xml"))
},
method: func(c *Client) error {
_, err := c.GetBalance()
diff --git a/pkg/client/bass_test.go b/pkg/client/bass_test.go
index 25f88f6..0faf5ce 100644
--- a/pkg/client/bass_test.go
+++ b/pkg/client/bass_test.go
@@ -81,7 +81,7 @@ func TestClient_GetBass(t *testing.T) {
}
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(tt.serverResponse))
+ _, _ = w.Write([]byte(tt.serverResponse))
}))
defer server.Close()
@@ -372,7 +372,7 @@ func TestClient_IncreaseBass(t *testing.T) {
}
}
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.Method == "POST" && r.URL.Path == "/bass" {
postCallCount++
w.WriteHeader(http.StatusOK)
@@ -467,7 +467,7 @@ func TestClient_DecreaseBass(t *testing.T) {
}
}
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.Method == "POST" && r.URL.Path == "/bass" {
postCallCount++
w.WriteHeader(http.StatusOK)
@@ -514,9 +514,9 @@ func TestClient_Bass_ErrorHandling(t *testing.T) {
}{
{
name: "GetBass server returns 404",
- serverResponse: func(w http.ResponseWriter, r *http.Request) {
+ serverResponse: func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusNotFound)
- w.Write([]byte("Not Found"))
+ _, _ = w.Write([]byte("Not Found"))
},
method: func(c *Client) error {
_, err := c.GetBass()
@@ -527,9 +527,9 @@ func TestClient_Bass_ErrorHandling(t *testing.T) {
},
{
name: "SetBass server returns 500",
- serverResponse: func(w http.ResponseWriter, r *http.Request) {
+ serverResponse: func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
},
method: func(c *Client) error {
return c.SetBass(3)
@@ -539,9 +539,9 @@ func TestClient_Bass_ErrorHandling(t *testing.T) {
},
{
name: "GetBass invalid XML response",
- serverResponse: func(w http.ResponseWriter, r *http.Request) {
+ serverResponse: func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
- w.Write([]byte("invalid xml"))
+ _, _ = w.Write([]byte("invalid xml"))
},
method: func(c *Client) error {
_, err := c.GetBass()
diff --git a/pkg/client/client.go b/pkg/client/client.go
index 2eeab82..faa65a6 100644
--- a/pkg/client/client.go
+++ b/pkg/client/client.go
@@ -1,3 +1,4 @@
+// Package client provides HTTP client functionality for interacting with Bose SoundTouch devices.
package client
import (
@@ -648,8 +649,9 @@ func (c *Client) get(endpoint string, result interface{}) error {
return fmt.Errorf("failed to execute request: %w", err)
}
defer func() {
- if err := resp.Body.Close(); err != nil {
+ if closeErr := resp.Body.Close(); closeErr != nil {
// Log the error but don't override the main error
+ _ = closeErr // Explicitly ignore the error
}
}()
@@ -703,8 +705,9 @@ func (c *Client) post(endpoint string, payload, result interface{}) error {
return fmt.Errorf("failed to execute request: %w", err)
}
defer func() {
- if err := resp.Body.Close(); err != nil {
+ if closeErr := resp.Body.Close(); closeErr != nil {
// Log the error but don't override the main error
+ _ = closeErr // Explicitly ignore the error
}
}()
diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go
index 98f482a..71f6d00 100644
--- a/pkg/client/client_test.go
+++ b/pkg/client/client_test.go
@@ -88,7 +88,7 @@ func TestGetDeviceInfo_Success(t *testing.T) {
// Send response
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(testData))
+ _, _ = w.Write([]byte(testData))
}))
defer server.Close()
@@ -157,7 +157,7 @@ func TestGetDeviceInfo_HTTPError(t *testing.T) {
// Create mock server that returns 404
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
- w.Write([]byte("Not Found"))
+ _, _ = w.Write([]byte("Not Found"))
}))
defer server.Close()
@@ -180,7 +180,7 @@ func TestGetDeviceInfo_InvalidXML(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte("invalid xml content"))
+ _, _ = w.Write([]byte("invalid xml content"))
}))
defer server.Close()
@@ -203,7 +203,7 @@ func TestGetDeviceInfo_APIError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(`Device not found`))
+ _, _ = w.Write([]byte(`Device not found`))
}))
defer server.Close()
@@ -227,7 +227,7 @@ func TestPing_Success(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(testData))
+ _, _ = w.Write([]byte(testData))
}))
defer server.Close()
@@ -267,7 +267,7 @@ func TestClientTimeout(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(200 * time.Millisecond)
w.WriteHeader(http.StatusOK)
- w.Write([]byte(``))
+ _, _ = w.Write([]byte(``))
}))
defer server.Close()
@@ -356,7 +356,7 @@ func TestClient_GetNowPlaying(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write(data)
+ _, _ = w.Write(data)
}))
defer server.Close()
@@ -416,7 +416,7 @@ func TestClient_GetNowPlaying(t *testing.T) {
func TestClient_GetNowPlaying_ServerError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
}))
defer server.Close()
@@ -465,7 +465,7 @@ func TestClient_GetNowPlaying_InvalidXML(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(""))
+ _, _ = w.Write([]byte(""))
}))
defer server.Close()
@@ -542,7 +542,7 @@ func TestClient_GetSources(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write(data)
+ _, _ = w.Write(data)
}))
defer server.Close()
@@ -607,7 +607,7 @@ func TestClient_GetSources(t *testing.T) {
func TestClient_GetSources_ServerError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
}))
defer server.Close()
@@ -656,7 +656,7 @@ func TestClient_GetSources_InvalidXML(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(""))
+ _, _ = w.Write([]byte(""))
}))
defer server.Close()
@@ -725,7 +725,7 @@ func TestClient_GetName(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write(data)
+ _, _ = w.Write(data)
}))
defer server.Close()
@@ -809,7 +809,7 @@ func TestClient_GetCapabilities(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write(data)
+ _, _ = w.Write(data)
}))
defer server.Close()
@@ -903,7 +903,7 @@ func TestClient_GetPresets(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write(data)
+ _, _ = w.Write(data)
}))
defer server.Close()
@@ -958,7 +958,7 @@ func TestClient_GetPresets(t *testing.T) {
func TestClient_GetName_ServerError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
}))
defer server.Close()
@@ -987,7 +987,7 @@ func TestClient_GetName_ServerError(t *testing.T) {
func TestClient_GetCapabilities_ServerError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
}))
defer server.Close()
@@ -1016,7 +1016,7 @@ func TestClient_GetCapabilities_ServerError(t *testing.T) {
func TestClient_GetPresets_ServerError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
}))
defer server.Close()
diff --git a/pkg/client/source_selection_test.go b/pkg/client/source_selection_test.go
index 67d2c37..ce7250f 100644
--- a/pkg/client/source_selection_test.go
+++ b/pkg/client/source_selection_test.go
@@ -393,7 +393,7 @@ func TestClient_SelectSource_ErrorHandling(t *testing.T) {
name: "Server returns 404",
serverResponse: func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
- w.Write([]byte("Not Found"))
+ _, _ = w.Write([]byte("Not Found"))
},
wantError: true,
errorContains: "API request failed with status 404",
@@ -402,7 +402,7 @@ func TestClient_SelectSource_ErrorHandling(t *testing.T) {
name: "Server returns 500",
serverResponse: func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte("Internal Server Error"))
+ _, _ = w.Write([]byte("Internal Server Error"))
},
wantError: true,
errorContains: "API request failed with status 500",
diff --git a/pkg/client/system_test.go b/pkg/client/system_test.go
index 6368f23..e38026f 100644
--- a/pkg/client/system_test.go
+++ b/pkg/client/system_test.go
@@ -53,7 +53,7 @@ func TestClient_GetClockTime(t *testing.T) {
}
w.WriteHeader(tt.statusCode)
- w.Write([]byte(tt.serverResponse))
+ _, _ = w.Write([]byte(tt.serverResponse))
}))
defer server.Close()
@@ -216,7 +216,7 @@ func TestClient_GetClockDisplay(t *testing.T) {
}
w.WriteHeader(tt.statusCode)
- w.Write([]byte(tt.serverResponse))
+ _, _ = w.Write([]byte(tt.serverResponse))
}))
defer server.Close()
@@ -475,7 +475,7 @@ func TestClient_GetNetworkInfo(t *testing.T) {
}
w.WriteHeader(tt.statusCode)
- w.Write([]byte(tt.serverResponse))
+ _, _ = w.Write([]byte(tt.serverResponse))
}))
defer server.Close()
@@ -510,18 +510,18 @@ func TestClient_SystemEndpoints_Integration(t *testing.T) {
switch r.URL.Path {
case "/clockTime":
if r.Method == "GET" {
- w.Write([]byte(`2021-01-01 00:00:00`))
+ _, _ = w.Write([]byte(`2021-01-01 00:00:00`))
} else if r.Method == "POST" {
w.WriteHeader(http.StatusOK)
}
case "/clockDisplay":
if r.Method == "GET" {
- w.Write([]byte(``))
+ _, _ = w.Write([]byte(``))
} else if r.Method == "POST" {
w.WriteHeader(http.StatusOK)
}
case "/networkInfo":
- w.Write([]byte(`
+ _, _ = w.Write([]byte(`
diff --git a/pkg/client/websocket.go b/pkg/client/websocket.go
index 3f082d8..684c7a4 100644
--- a/pkg/client/websocket.go
+++ b/pkg/client/websocket.go
@@ -34,6 +34,7 @@ type Logger interface {
// DefaultLogger uses standard log package
type DefaultLogger struct{}
+// Printf implements the Logger interface by printing formatted messages with a WebSocket prefix.
func (d DefaultLogger) Printf(format string, v ...interface{}) {
log.Printf("[WebSocket] "+format, v...)
}
@@ -181,7 +182,7 @@ func (ws *WebSocketClient) connectWithConfig(config *WebSocketConfig) error {
// Establish connection
conn, resp, err := dialer.DialContext(ws.ctx, wsURL.String(), nil)
if resp != nil && resp.Body != nil {
- defer resp.Body.Close()
+ defer func() { _ = resp.Body.Close() }()
}
if err != nil {
return fmt.Errorf("failed to connect to WebSocket: %w", err)
diff --git a/pkg/client/websocket_test.go b/pkg/client/websocket_test.go
index a91959a..a437a57 100644
--- a/pkg/client/websocket_test.go
+++ b/pkg/client/websocket_test.go
@@ -32,17 +32,11 @@ func (m *mockLogger) getMessages() []string {
return result
}
-func (m *mockLogger) clear() {
- m.mu.Lock()
- defer m.mu.Unlock()
- m.messages = nil
-}
-
// setupMockWebSocketServer creates a test WebSocket server
func setupMockWebSocketServer(t *testing.T) (*httptest.Server, chan []byte) {
t.Helper()
upgrader := websocket.Upgrader{
- CheckOrigin: func(r *http.Request) bool {
+ CheckOrigin: func(_ *http.Request) bool {
return true
},
}
@@ -176,11 +170,11 @@ func TestWebSocketClient_IndividualHandlers(t *testing.T) {
// Handler implementation for testing
})
- wsClient.OnVolumeUpdated(func(event *models.VolumeUpdatedEvent) {
+ wsClient.OnVolumeUpdated(func(_ *models.VolumeUpdatedEvent) {
// Handler implementation for testing
})
- wsClient.OnConnectionState(func(event *models.ConnectionStateUpdatedEvent) {
+ wsClient.OnConnectionState(func(_ *models.ConnectionStateUpdatedEvent) {
// Handler implementation for testing
})
@@ -433,11 +427,11 @@ func TestWebSocketClient_ConcurrentAccess(_ *testing.T) {
go func() {
defer wg.Done()
- wsClient.OnNowPlaying(func(event *models.NowPlayingUpdatedEvent) {
+ wsClient.OnNowPlaying(func(_ *models.NowPlayingUpdatedEvent) {
// Handler implementation
})
- wsClient.OnVolumeUpdated(func(event *models.VolumeUpdatedEvent) {
+ wsClient.OnVolumeUpdated(func(_ *models.VolumeUpdatedEvent) {
// Handler implementation
})
@@ -456,7 +450,7 @@ func BenchmarkWebSocketClient_HandleMessage(b *testing.B) {
Logger: &mockLogger{},
})
- wsClient.OnNowPlaying(func(event *models.NowPlayingUpdatedEvent) {
+ wsClient.OnNowPlaying(func(_ *models.NowPlayingUpdatedEvent) {
// Minimal handler for benchmarking
})
@@ -483,7 +477,7 @@ func BenchmarkWebSocketClient_SetHandlers(b *testing.B) {
wsClient := client.NewWebSocketClient(nil)
handlers := &models.WebSocketEventHandlers{
- OnNowPlaying: func(event *models.NowPlayingUpdatedEvent) {},
+ OnNowPlaying: func(_ *models.NowPlayingUpdatedEvent) {},
OnVolumeUpdated: func(event *models.VolumeUpdatedEvent) {},
}
diff --git a/pkg/client/zone_test.go b/pkg/client/zone_test.go
index 99d5a65..f5cfca2 100644
--- a/pkg/client/zone_test.go
+++ b/pkg/client/zone_test.go
@@ -73,7 +73,7 @@ func TestClient_GetZone(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(tt.responseStatus)
- w.Write([]byte(tt.responseXML))
+ _, _ = w.Write([]byte(tt.responseXML))
}))
defer server.Close()
@@ -170,7 +170,7 @@ func TestClient_SetZone(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(tt.responseStatus)
if tt.responseStatus != http.StatusOK {
- w.Write([]byte(`Server Error`))
+ _, _ = w.Write([]byte(`Server Error`))
}
}))
defer server.Close()
@@ -256,7 +256,7 @@ func TestClient_AddToZone(t *testing.T) {
EFGH5678IJKL
`
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.URL.Path == "/setZone" && r.Method == http.MethodPost {
setZoneCalled = true
w.WriteHeader(http.StatusOK)
@@ -297,7 +297,7 @@ func TestClient_RemoveFromZone(t *testing.T) {
IJKL9012MNOP
`
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.URL.Path == "/setZone" && r.Method == http.MethodPost {
setZoneCalled = true
w.WriteHeader(http.StatusOK)
@@ -338,7 +338,7 @@ func TestClient_DissolveZone(t *testing.T) {
IJKL9012MNOP
`
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
} else if r.URL.Path == "/setZone" && r.Method == http.MethodPost {
setZoneCalled = true
w.WriteHeader(http.StatusOK)
@@ -397,7 +397,7 @@ func TestClient_IsInZone(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(tt.responseXML))
+ _, _ = w.Write([]byte(tt.responseXML))
}))
defer server.Close()
@@ -480,9 +480,9 @@ func TestClient_GetZoneStatus(t *testing.T) {
w.WriteHeader(http.StatusOK)
if r.URL.Path == "/getZone" {
- w.Write([]byte(tt.zoneXML))
+ _, _ = w.Write([]byte(tt.zoneXML))
} else if r.URL.Path == "/info" {
- w.Write([]byte(tt.deviceInfoXML))
+ _, _ = w.Write([]byte(tt.deviceInfoXML))
} else {
w.WriteHeader(http.StatusNotFound)
}
@@ -546,7 +546,7 @@ func TestClient_GetZoneMembers(t *testing.T) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(tt.responseXML))
+ _, _ = w.Write([]byte(tt.responseXML))
}))
defer server.Close()
@@ -605,7 +605,7 @@ func TestClient_Zone_ErrorHandling(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/getZone" {
w.WriteHeader(http.StatusInternalServerError)
- w.Write([]byte(`Server Error`))
+ _, _ = w.Write([]byte(`Server Error`))
}
}))
defer server.Close()
@@ -626,7 +626,7 @@ func TestClient_Zone_ErrorHandling(t *testing.T) {
// Benchmark tests
func BenchmarkClient_GetZone(b *testing.B) {
- server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
response := `
EFGH5678IJKL
@@ -634,7 +634,7 @@ func BenchmarkClient_GetZone(b *testing.B) {
`
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
- w.Write([]byte(response))
+ _, _ = w.Write([]byte(response))
}))
defer server.Close()
@@ -650,7 +650,7 @@ func BenchmarkClient_GetZone(b *testing.B) {
}
func BenchmarkClient_SetZone(b *testing.B) {
- server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(http.StatusOK)
}))
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index 62a881f..65ccd68 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -216,7 +216,7 @@ func TestParseDeviceString_EmptyHost(t *testing.T) {
func TestParsePreferredDevices_SingleDevice(t *testing.T) {
clearTestEnvVars()
- os.Setenv("PREFERRED_DEVICES", "192.168.1.100")
+ _ = os.Setenv("PREFERRED_DEVICES", "192.168.1.100")
defer clearTestEnvVars()
devices, err := parsePreferredDevices()
@@ -235,7 +235,7 @@ func TestParsePreferredDevices_SingleDevice(t *testing.T) {
func TestParsePreferredDevices_MultipleDevices(t *testing.T) {
clearTestEnvVars()
- os.Setenv("PREFERRED_DEVICES", "Living Room@192.168.1.100:8090;Kitchen@192.168.1.101;192.168.1.102:8091")
+ _ = os.Setenv("PREFERRED_DEVICES", "Living Room@192.168.1.100:8090;Kitchen@192.168.1.101;192.168.1.102:8091")
defer clearTestEnvVars()
devices, err := parsePreferredDevices()
@@ -283,7 +283,7 @@ func TestParsePreferredDevices_MultipleDevices(t *testing.T) {
func TestParsePreferredDevices_EmptyString(t *testing.T) {
clearTestEnvVars()
- os.Setenv("PREFERRED_DEVICES", "")
+ _ = os.Setenv("PREFERRED_DEVICES", "")
defer clearTestEnvVars()
devices, err := parsePreferredDevices()
@@ -298,7 +298,7 @@ func TestParsePreferredDevices_EmptyString(t *testing.T) {
func TestParsePreferredDevices_InvalidDevice(t *testing.T) {
clearTestEnvVars()
- os.Setenv("PREFERRED_DEVICES", "192.168.1.100:invalid")
+ _ = os.Setenv("PREFERRED_DEVICES", "192.168.1.100:invalid")
defer clearTestEnvVars()
_, err := parsePreferredDevices()
diff --git a/pkg/discovery/constants.go b/pkg/discovery/constants.go
index f15c313..c6c22ab 100644
--- a/pkg/discovery/constants.go
+++ b/pkg/discovery/constants.go
@@ -1,3 +1,4 @@
+// Package discovery provides device discovery functionality for Bose SoundTouch devices using mDNS and UPnP protocols.
package discovery
import "time"
diff --git a/pkg/discovery/upnp.go b/pkg/discovery/upnp.go
index f1c9109..af25d20 100644
--- a/pkg/discovery/upnp.go
+++ b/pkg/discovery/upnp.go
@@ -349,7 +349,7 @@ func (d *DiscoveryService) parseLocationURL(location string) (*models.Discovered
}
// enrichDeviceInfo tries to get additional device information from the device description
-func (d *DiscoveryService) enrichDeviceInfo(device *models.DiscoveredDevice, location string) error {
+func (d *DiscoveryService) enrichDeviceInfo(_ *models.DiscoveredDevice, location string) error {
log.Printf("UPnP: Attempting to enrich device info by fetching %s", location)
client := &http.Client{
diff --git a/pkg/models/networkinfo.go b/pkg/models/networkinfo.go
index 501b932..6ba9c2f 100644
--- a/pkg/models/networkinfo.go
+++ b/pkg/models/networkinfo.go
@@ -107,9 +107,10 @@ func (n *NetworkInformation) HasEthernet() bool {
// GetConnectedWiFiInterface returns the connected WiFi interface if available
func (n *NetworkInformation) GetConnectedWiFiInterface() *NetworkInterface {
- for _, iface := range n.GetInterfaces() {
- if iface.IsWiFi() && iface.IsConnected() {
- return &iface
+ interfaces := n.GetInterfaces()
+ for i := range interfaces {
+ if interfaces[i].IsWiFi() && interfaces[i].IsConnected() {
+ return &interfaces[i]
}
}
return nil
@@ -117,9 +118,10 @@ func (n *NetworkInformation) GetConnectedWiFiInterface() *NetworkInterface {
// GetConnectedEthernetInterface returns the connected Ethernet interface if available
func (n *NetworkInformation) GetConnectedEthernetInterface() *NetworkInterface {
- for _, iface := range n.GetInterfaces() {
- if iface.IsEthernet() && iface.IsConnected() {
- return &iface
+ interfaces := n.GetInterfaces()
+ for i := range interfaces {
+ if interfaces[i].IsEthernet() && interfaces[i].IsConnected() {
+ return &interfaces[i]
}
}
return nil
diff --git a/pkg/models/sources.go b/pkg/models/sources.go
index 8b9b4e9..03b56be 100644
--- a/pkg/models/sources.go
+++ b/pkg/models/sources.go
@@ -82,7 +82,12 @@ func (si *SourceItem) GetDisplayName() string {
if si.SourceAccount != "" && si.SourceAccount != si.Source {
return si.SourceAccount
}
- return strings.Title(strings.ToLower(si.Source))
+ // Manually implement title case to replace deprecated strings.Title
+ source := strings.ToLower(si.Source)
+ if len(source) == 0 {
+ return source
+ }
+ return strings.ToUpper(source[:1]) + source[1:]
}
// IsSpotify returns true if this is a Spotify source
diff --git a/pkg/models/websocket.go b/pkg/models/websocket.go
index 29c6251..2e21b45 100644
--- a/pkg/models/websocket.go
+++ b/pkg/models/websocket.go
@@ -34,7 +34,8 @@ const (
EventTypeRecentsUpdated WebSocketEventType = "recentsUpdated"
// EventTypeLanguageUpdated indicates a language setting change
EventTypeLanguageUpdated WebSocketEventType = "languageUpdated"
- EventTypeUnknown WebSocketEventType = "unknown"
+ // EventTypeUnknown indicates an unrecognized event type
+ EventTypeUnknown WebSocketEventType = "unknown"
)
// String returns a human-readable string representation