fix(android): split wire types — one declaration per file

Hypothesis for the KSP2 "LibraryApi could not be resolved" failure:
ArtistWire.kt and AlbumWire.kt each declared TWO @Serializable
classes (the Ref and the Detail variant). LibraryApi imports the
Detail variants but the file names match the Ref variants. KSP2's
symbol indexing may key on `className.kt` and fail to surface the
second declaration in a multi-class file.

Splitting per the MatchingDeclarationName convention:
  - ArtistDetailWire.kt (new)
  - AlbumDetailWire.kt (new)
  - ArtistWire.kt / AlbumWire.kt now contain only their namesake type

If this fixes it, the LibraryApi resolution will work without
changing the @Provides signature.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-22 20:57:04 -04:00
parent ee72459881
commit fe878a392c
4 changed files with 40 additions and 35 deletions
@@ -0,0 +1,22 @@
package com.fabledsword.minstrel.models.wire
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Wire shape for `GET /api/albums/{id}` — server returns AlbumRef
* fields PLUS an embedded `tracks` array.
*/
@Serializable
data class AlbumDetailWire(
val id: String,
val title: String,
@SerialName("artist_id") val artistId: String,
@SerialName("sort_title") val sortTitle: String = "",
@SerialName("artist_name") val artistName: String = "",
val year: Int? = null,
@SerialName("track_count") val trackCount: Int = 0,
@SerialName("duration_sec") val durationSec: Int = 0,
@SerialName("cover_url") val coverUrl: String = "",
val tracks: List<TrackWire> = emptyList(),
)
@@ -18,21 +18,3 @@ data class AlbumWire(
@SerialName("duration_sec") val durationSec: Int = 0,
@SerialName("cover_url") val coverUrl: String = "",
)
/**
* Wire shape for `GET /api/albums/{id}` — server returns AlbumRef
* fields PLUS an embedded `tracks` array.
*/
@Serializable
data class AlbumDetailWire(
val id: String,
val title: String,
@SerialName("artist_id") val artistId: String,
@SerialName("sort_title") val sortTitle: String = "",
@SerialName("artist_name") val artistName: String = "",
val year: Int? = null,
@SerialName("track_count") val trackCount: Int = 0,
@SerialName("duration_sec") val durationSec: Int = 0,
@SerialName("cover_url") val coverUrl: String = "",
val tracks: List<TrackWire> = emptyList(),
)
@@ -0,0 +1,18 @@
package com.fabledsword.minstrel.models.wire
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Wire shape for `GET /api/artists/{id}` — server returns ArtistRef
* fields PLUS an embedded `albums` array.
*/
@Serializable
data class ArtistDetailWire(
val id: String,
val name: String,
@SerialName("sort_name") val sortName: String = "",
@SerialName("album_count") val albumCount: Int = 0,
@SerialName("cover_url") val coverUrl: String = "",
val albums: List<AlbumWire> = emptyList(),
)
@@ -14,20 +14,3 @@ data class ArtistWire(
@SerialName("album_count") val albumCount: Int = 0,
@SerialName("cover_url") val coverUrl: String = "",
)
/**
* Wire shape for `GET /api/artists/{id}` — server returns ArtistRef
* fields PLUS an embedded `albums` array. We can't directly map this
* to ArtistWire because Retrofit/kotlinx.serialization doesn't support
* a single record being two types; an explicit DetailWire spells out
* both halves and the repository handles the split.
*/
@Serializable
data class ArtistDetailWire(
val id: String,
val name: String,
@SerialName("sort_name") val sortName: String = "",
@SerialName("album_count") val albumCount: Int = 0,
@SerialName("cover_url") val coverUrl: String = "",
val albums: List<AlbumWire> = emptyList(),
)