Skip to content

Commit c414d82

Browse files
b0bbywanclaude
andcommitted
refactor(mpris): collapse the six extract* variant helpers into a generic
extract[T] replaces extractString/Bool/Int64/Float64/StringSlice/MetadataMap, matching the arg[T] signal-body helper already in the file. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AKi5652rX9cdUDycdU1btS
1 parent 0ee8858 commit c414d82

7 files changed

Lines changed: 42 additions & 75 deletions

File tree

backend/mpris/dbus.go

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -134,43 +134,10 @@ func arg[T any](sig *dbus.Signal, i int) (T, bool) {
134134
return v, ok
135135
}
136136

137-
// Value extraction helpers from dbus.Variant
138-
// These helpers are used to extract values from variants received
139-
// in D-Bus signals without making additional D-Bus calls.
140-
141-
// extractString extracts a string from a dbus.Variant
142-
func extractString(v dbus.Variant) (string, bool) {
143-
val, ok := v.Value().(string)
144-
return val, ok
145-
}
146-
147-
// extractBool extracts a bool from a dbus.Variant
148-
func extractBool(v dbus.Variant) (bool, bool) {
149-
val, ok := v.Value().(bool)
150-
return val, ok
151-
}
152-
153-
// extractInt64 extracts an int64 from a dbus.Variant
154-
func extractInt64(v dbus.Variant) (int64, bool) {
155-
val, ok := v.Value().(int64)
156-
return val, ok
157-
}
158-
159-
// extractFloat64 extracts a float64 from a dbus.Variant
160-
func extractFloat64(v dbus.Variant) (float64, bool) {
161-
val, ok := v.Value().(float64)
162-
return val, ok
163-
}
164-
165-
// extractStringSlice extracts a []string from a dbus.Variant
166-
func extractStringSlice(v dbus.Variant) ([]string, bool) {
167-
val, ok := v.Value().([]string)
168-
return val, ok
169-
}
170-
171-
// extractMetadataMap extracts a metadata map from a dbus.Variant
172-
func extractMetadataMap(v dbus.Variant) (map[string]dbus.Variant, bool) {
173-
val, ok := v.Value().(map[string]dbus.Variant)
137+
// extract returns the variant's value as T, false if it holds another type.
138+
// Lets signal handlers read values without additional D-Bus calls.
139+
func extract[T any](v dbus.Variant) (T, bool) {
140+
val, ok := v.Value().(T)
174141
return val, ok
175142
}
176143

backend/mpris/heartbeat.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (h *Heartbeat) updatePlayingPositions() bool {
108108
continue
109109
}
110110

111-
pos, ok := extractInt64(variant)
111+
pos, ok := extract[int64](variant)
112112
if !ok || !shouldAcceptPosition(&player, pos) {
113113
continue
114114
}

backend/mpris/listener.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (l *Listener) handlePropertiesChanged(sig *dbus.Signal) {
124124

125125
// Check if PlaybackStatus changed for deduplication
126126
if statusVar, hasStatus := changed["PlaybackStatus"]; hasStatus {
127-
if status, ok := extractString(statusVar); ok {
127+
if status, ok := extract[string](statusVar); ok {
128128
newStatus := PlaybackStatus(status)
129129

130130
// Deduplication

backend/mpris/mpris.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -221,23 +221,23 @@ func (m *MPRISBackend) UpdatePlayerProperties(busName string, changed map[string
221221
for key, variant := range changed {
222222
switch key {
223223
case "PlaybackStatus":
224-
if val, ok := extractString(variant); ok {
224+
if val, ok := extract[string](variant); ok {
225225
players[i].PlaybackStatus = PlaybackStatus(val)
226226
}
227227
case "LoopStatus":
228-
if val, ok := extractString(variant); ok {
228+
if val, ok := extract[string](variant); ok {
229229
players[i].LoopStatus = LoopStatus(val)
230230
}
231231
case "Shuffle":
232-
if val, ok := extractBool(variant); ok {
232+
if val, ok := extract[bool](variant); ok {
233233
players[i].Shuffle = val
234234
}
235235
case "Volume":
236-
if val, ok := extractFloat64(variant); ok {
236+
if val, ok := extract[float64](variant); ok {
237237
players[i].Volume = &val
238238
}
239239
case "Metadata":
240-
if metaMap, ok := extractMetadataMap(variant); ok {
240+
if metaMap, ok := extract[map[string]dbus.Variant](variant); ok {
241241
oldTrackID := players[i].Metadata["mpris:trackid"]
242242
players[i].Metadata = make(map[string]string)
243243
for k, v := range metaMap {
@@ -252,36 +252,36 @@ func (m *MPRISBackend) UpdatePlayerProperties(busName string, changed map[string
252252
}
253253
}
254254
case "Rate":
255-
if val, ok := extractFloat64(variant); ok {
255+
if val, ok := extract[float64](variant); ok {
256256
players[i].Rate = val
257257
}
258258
case "Position":
259-
if val, ok := extractInt64(variant); ok && shouldAcceptPosition(&players[i], val) {
259+
if val, ok := extract[int64](variant); ok && shouldAcceptPosition(&players[i], val) {
260260
players[i].Position = val
261261
players[i].PositionUpdatedAt = time.Now()
262262
}
263263
case "CanPlay":
264-
if val, ok := extractBool(variant); ok {
264+
if val, ok := extract[bool](variant); ok {
265265
players[i].Capabilities.CanPlay = val
266266
}
267267
case "CanPause":
268-
if val, ok := extractBool(variant); ok {
268+
if val, ok := extract[bool](variant); ok {
269269
players[i].Capabilities.CanPause = val
270270
}
271271
case "CanGoNext":
272-
if val, ok := extractBool(variant); ok {
272+
if val, ok := extract[bool](variant); ok {
273273
players[i].Capabilities.CanGoNext = val
274274
}
275275
case "CanGoPrevious":
276-
if val, ok := extractBool(variant); ok {
276+
if val, ok := extract[bool](variant); ok {
277277
players[i].Capabilities.CanGoPrevious = val
278278
}
279279
case "CanSeek":
280-
if val, ok := extractBool(variant); ok {
280+
if val, ok := extract[bool](variant); ok {
281281
players[i].Capabilities.CanSeek = val
282282
}
283283
case "CanControl":
284-
if val, ok := extractBool(variant); ok {
284+
if val, ok := extract[bool](variant); ok {
285285
players[i].Capabilities.CanControl = val
286286
}
287287
}

backend/mpris/mpris_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -549,12 +549,12 @@ func TestExtractString(t *testing.T) {
549549

550550
for _, tt := range tests {
551551
t.Run(tt.name, func(t *testing.T) {
552-
value, ok := extractString(tt.variant)
552+
value, ok := extract[string](tt.variant)
553553
if ok != tt.wantOk {
554-
t.Errorf("extractString() ok = %v, want %v", ok, tt.wantOk)
554+
t.Errorf("extract[string]() ok = %v, want %v", ok, tt.wantOk)
555555
}
556556
if value != tt.wantValue {
557-
t.Errorf("extractString() value = %q, want %q", value, tt.wantValue)
557+
t.Errorf("extract[string]() value = %q, want %q", value, tt.wantValue)
558558
}
559559
})
560560
}
@@ -589,12 +589,12 @@ func TestExtractBool(t *testing.T) {
589589

590590
for _, tt := range tests {
591591
t.Run(tt.name, func(t *testing.T) {
592-
value, ok := extractBool(tt.variant)
592+
value, ok := extract[bool](tt.variant)
593593
if ok != tt.wantOk {
594-
t.Errorf("extractBool() ok = %v, want %v", ok, tt.wantOk)
594+
t.Errorf("extract[bool]() ok = %v, want %v", ok, tt.wantOk)
595595
}
596596
if value != tt.wantValue {
597-
t.Errorf("extractBool() value = %v, want %v", value, tt.wantValue)
597+
t.Errorf("extract[bool]() value = %v, want %v", value, tt.wantValue)
598598
}
599599
})
600600
}
@@ -635,12 +635,12 @@ func TestExtractInt64(t *testing.T) {
635635

636636
for _, tt := range tests {
637637
t.Run(tt.name, func(t *testing.T) {
638-
value, ok := extractInt64(tt.variant)
638+
value, ok := extract[int64](tt.variant)
639639
if ok != tt.wantOk {
640-
t.Errorf("extractInt64() ok = %v, want %v", ok, tt.wantOk)
640+
t.Errorf("extract[int64]() ok = %v, want %v", ok, tt.wantOk)
641641
}
642642
if value != tt.wantValue {
643-
t.Errorf("extractInt64() value = %v, want %v", value, tt.wantValue)
643+
t.Errorf("extract[int64]() value = %v, want %v", value, tt.wantValue)
644644
}
645645
})
646646
}
@@ -681,12 +681,12 @@ func TestExtractFloat64(t *testing.T) {
681681

682682
for _, tt := range tests {
683683
t.Run(tt.name, func(t *testing.T) {
684-
value, ok := extractFloat64(tt.variant)
684+
value, ok := extract[float64](tt.variant)
685685
if ok != tt.wantOk {
686-
t.Errorf("extractFloat64() ok = %v, want %v", ok, tt.wantOk)
686+
t.Errorf("extract[float64]() ok = %v, want %v", ok, tt.wantOk)
687687
}
688688
if value != tt.wantValue {
689-
t.Errorf("extractFloat64() value = %v, want %v", value, tt.wantValue)
689+
t.Errorf("extract[float64]() value = %v, want %v", value, tt.wantValue)
690690
}
691691
})
692692
}
@@ -719,9 +719,9 @@ func TestExtractMetadataMap(t *testing.T) {
719719

720720
for _, tt := range tests {
721721
t.Run(tt.name, func(t *testing.T) {
722-
_, ok := extractMetadataMap(tt.variant)
722+
_, ok := extract[map[string]dbus.Variant](tt.variant)
723723
if ok != tt.wantOk {
724-
t.Errorf("extractMetadataMap() ok = %v, want %v", ok, tt.wantOk)
724+
t.Errorf("extract[map[string]dbus.Variant]() ok = %v, want %v", ok, tt.wantOk)
725725
}
726726
})
727727
}

backend/mpris/player.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,37 +112,37 @@ func (p *Player) loadFromDBus() error {
112112
// Handle according to field type
113113
switch field.Kind() {
114114
case reflect.String:
115-
if val, ok := extractString(variant); ok {
115+
if val, ok := extract[string](variant); ok {
116116
field.SetString(val)
117117
}
118118

119119
case reflect.Bool:
120-
if val, ok := extractBool(variant); ok {
120+
if val, ok := extract[bool](variant); ok {
121121
field.SetBool(val)
122122
}
123123

124124
case reflect.Float64:
125-
if val, ok := extractFloat64(variant); ok {
125+
if val, ok := extract[float64](variant); ok {
126126
field.SetFloat(val)
127127
}
128128

129129
case reflect.Ptr:
130130
// Volume is *float64 so we can distinguish "muted to 0" from
131131
// "player does not expose the property" (nil → JSON-omitted).
132132
if field.Type().Elem().Kind() == reflect.Float64 {
133-
if val, ok := extractFloat64(variant); ok {
133+
if val, ok := extract[float64](variant); ok {
134134
field.Set(reflect.ValueOf(&val))
135135
}
136136
}
137137

138138
case reflect.Int64:
139-
if val, ok := extractInt64(variant); ok {
139+
if val, ok := extract[int64](variant); ok {
140140
field.SetInt(val)
141141
}
142142

143143
case reflect.Slice:
144144
if field.Type().Elem().Kind() == reflect.String {
145-
if val, ok := extractStringSlice(variant); ok {
145+
if val, ok := extract[[]string](variant); ok {
146146
field.Set(reflect.ValueOf(val))
147147
}
148148
}
@@ -181,7 +181,7 @@ func (p *Player) loadTracklist() {
181181
p.TracklistSupported = true
182182

183183
if v, ok := props["CanEditTracks"]; ok {
184-
if canEdit, ok := extractBool(v); ok {
184+
if canEdit, ok := extract[bool](v); ok {
185185
p.CanEditTracks = canEdit
186186
}
187187
}
@@ -255,7 +255,7 @@ func (p *Player) loadCapabilitiesFromProps(props map[string]dbus.Variant) Capabi
255255

256256
// Retrieve property from props
257257
if variant, ok := props[dbusTag]; ok {
258-
if boolVal, ok := extractBool(variant); ok {
258+
if boolVal, ok := extract[bool](variant); ok {
259259
field.SetBool(boolVal)
260260
}
261261
}

backend/mpris/tracklist.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func (m *MPRISBackend) UpdateTrackMetadataInCache(busName, oldTrackID string, tr
168168

169169
// UpdateCanEditTracks handles CanEditTracks arriving via PropertiesChanged.
170170
func (m *MPRISBackend) UpdateCanEditTracks(busName string, variant dbus.Variant) error {
171-
val, ok := extractBool(variant)
171+
val, ok := extract[bool](variant)
172172
if !ok {
173173
return nil
174174
}

0 commit comments

Comments
 (0)