From 8c4b8dfb56242983562d22002957684f719b603d Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 8 Jan 2025 12:53:04 -0700 Subject: [PATCH] musikr: improve dead vertex error reporting --- .../org/oxycblt/musikr/graph/MusicGraph.kt | 29 ++++++++++----- .../oxycblt/musikr/model/LibraryFactory.kt | 36 ++++++++++++------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt b/musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt index 121a53cf4..4b33dc966 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt @@ -322,33 +322,46 @@ private class MusicGraphBuilderImpl : MusicGraph.Builder { } } +internal interface Vertex { + val tag: Any? +} + internal class SongVertex( val preSong: PreSong, var albumVertex: AlbumVertex, var artistVertices: MutableList, var genreVertices: MutableList -) { - var tag: Any? = null +) : Vertex { + override var tag: Any? = null + + override fun toString() = "SongVertex(preSong=$preSong)" } -internal class AlbumVertex(val preAlbum: PreAlbum, var artistVertices: MutableList) { +internal class AlbumVertex(val preAlbum: PreAlbum, var artistVertices: MutableList) : + Vertex { val songVertices = mutableSetOf() - var tag: Any? = null + override var tag: Any? = null + + override fun toString() = "AlbumVertex(preAlbum=$preAlbum)" } internal class ArtistVertex( val preArtist: PreArtist, -) { +) : Vertex { val songVertices = mutableSetOf() val albumVertices = mutableSetOf() val genreVertices = mutableSetOf() - var tag: Any? = null + override var tag: Any? = null + + override fun toString() = "ArtistVertex(preArtist=$preArtist)" } -internal class GenreVertex(val preGenre: PreGenre) { +internal class GenreVertex(val preGenre: PreGenre) : Vertex { val songVertices = mutableSetOf() val artistVertices = mutableSetOf() - var tag: Any? = null + override var tag: Any? = null + + override fun toString() = "GenreVertex(preGenre=$preGenre)" } internal class PlaylistVertex(val prePlaylist: PrePlaylist) { diff --git a/musikr/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt b/musikr/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt index 1bcd6d752..92296c80c 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt @@ -21,6 +21,7 @@ package org.oxycblt.musikr.model import org.oxycblt.musikr.Album import org.oxycblt.musikr.Artist import org.oxycblt.musikr.Genre +import org.oxycblt.musikr.Music import org.oxycblt.musikr.MutableLibrary import org.oxycblt.musikr.Song import org.oxycblt.musikr.graph.AlbumVertex @@ -29,6 +30,7 @@ import org.oxycblt.musikr.graph.GenreVertex import org.oxycblt.musikr.graph.MusicGraph import org.oxycblt.musikr.graph.PlaylistVertex import org.oxycblt.musikr.graph.SongVertex +import org.oxycblt.musikr.graph.Vertex import org.oxycblt.musikr.playlist.db.StoredPlaylists import org.oxycblt.musikr.playlist.interpret.PlaylistInterpreter @@ -77,44 +79,52 @@ private class LibraryFactoryImpl() : LibraryFactory { private class SongVertexCore(private val vertex: SongVertex) : SongCore { override val preSong = vertex.preSong - override fun resolveAlbum() = vertex.albumVertex.tag as Album + override fun resolveAlbum(): Album = tag(vertex.albumVertex) - override fun resolveArtists() = vertex.artistVertices.map { it.tag as Artist } + override fun resolveArtists(): List = vertex.artistVertices.map { tag(it) } - override fun resolveGenres() = vertex.genreVertices.map { it.tag as Genre } + override fun resolveGenres(): List = vertex.genreVertices.map { tag(it) } } private class AlbumVertexCore(private val vertex: AlbumVertex) : AlbumCore { override val preAlbum = vertex.preAlbum - override val songs = vertex.songVertices.mapTo(mutableSetOf()) { it.tag as Song } + override val songs: Set = vertex.songVertices.mapTo(mutableSetOf()) { tag(it) } - override fun resolveArtists() = vertex.artistVertices.map { it.tag as Artist } + override fun resolveArtists(): List = vertex.artistVertices.map { tag(it) } } private class ArtistVertexCore(private val vertex: ArtistVertex) : ArtistCore { override val preArtist = vertex.preArtist - override val songs = vertex.songVertices.mapTo(mutableSetOf()) { it.tag as Song } + override val songs: Set = vertex.songVertices.mapTo(mutableSetOf()) { tag(it) } - override val albums = vertex.albumVertices.mapTo(mutableSetOf()) { it.tag as Album } + override val albums: Set = vertex.albumVertices.mapTo(mutableSetOf()) { tag(it) } - override fun resolveGenres() = - vertex.genreVertices.mapTo(mutableSetOf()) { it.tag as Genre } + override fun resolveGenres(): Set = + vertex.genreVertices.mapTo(mutableSetOf()) { tag(it) } } private class GenreVertexCore(vertex: GenreVertex) : GenreCore { override val preGenre = vertex.preGenre - override val songs = vertex.songVertices.mapTo(mutableSetOf()) { it.tag as Song } + override val songs: Set = vertex.songVertices.mapTo(mutableSetOf()) { tag(it) } - override val artists = vertex.artistVertices.mapTo(mutableSetOf()) { it.tag as Artist } + override val artists: Set = vertex.artistVertices.mapTo(mutableSetOf()) { tag(it) } } private class PlaylistVertexCore(vertex: PlaylistVertex) : PlaylistCore { override val prePlaylist = vertex.prePlaylist - override val songs = - vertex.songVertices.mapNotNull { vertex -> vertex?.let { it.tag as Song } } + override val songs: List = + vertex.songVertices.mapNotNull { vertex -> vertex?.let { tag(it) } } + } + + private companion object { + private inline fun tag(vertex: Vertex): T { + val tag = vertex.tag + check(tag is T) { "Dead Vertex Detected: $vertex" } + return tag + } } }