From fe878a392c2cb359b4ffe60ede3636baed0e98d6 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 22 May 2026 20:57:04 -0400 Subject: [PATCH] =?UTF-8?q?fix(android):=20split=20wire=20types=20?= =?UTF-8?q?=E2=80=94=20one=20declaration=20per=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../minstrel/models/wire/AlbumDetailWire.kt | 22 +++++++++++++++++++ .../minstrel/models/wire/AlbumWire.kt | 18 --------------- .../minstrel/models/wire/ArtistDetailWire.kt | 18 +++++++++++++++ .../minstrel/models/wire/ArtistWire.kt | 17 -------------- 4 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumDetailWire.kt create mode 100644 android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistDetailWire.kt diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumDetailWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumDetailWire.kt new file mode 100644 index 00000000..6dc5d6a8 --- /dev/null +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumDetailWire.kt @@ -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 = emptyList(), +) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt index fbafb846..acf8f626 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/AlbumWire.kt @@ -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 = emptyList(), -) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistDetailWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistDetailWire.kt new file mode 100644 index 00000000..06e0522f --- /dev/null +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistDetailWire.kt @@ -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 = emptyList(), +) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt index dbf4283b..1c389a6a 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/ArtistWire.kt @@ -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 = emptyList(), -)