Skip to content

Commit 8e32e75

Browse files
committed
make episode and show descriptions nullable, lint
Signed-off-by: Adam Ratzman <[email protected]>
1 parent e3009ec commit 8e32e75

File tree

5 files changed

+101
-55
lines changed

5 files changed

+101
-55
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,4 +334,4 @@ gradle-app.setting
334334
**/build/
335335

336336
# End of https://www.toptal.com/developers/gitignore/api/gradle,kotlin,android,intellij+all,node
337-
docs
337+
docs/

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ buildscript {
3232
}
3333

3434
group = "com.adamratzman"
35-
version = "3.4.01"
35+
version = "3.4.02"
3636

3737
tasks.withType<Test> {
3838
this.testLogging {

src/commonMain/kotlin/com.adamratzman.spotify/models/Episode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import kotlinx.serialization.Serializable
3030
@Serializable
3131
public data class Episode(
3232
@SerialName("audio_preview_url") val audioPreviewUrl: String? = null,
33-
val description: String,
33+
val description: String? = null,
3434
@SerialName("duration_ms") val durationMs: Int,
3535
val explicit: Boolean,
3636
@SerialName("external_urls") override val externalUrlsString: Map<String, String>,
@@ -80,7 +80,7 @@ public data class Episode(
8080
@Serializable
8181
public data class SimpleEpisode(
8282
@SerialName("audio_preview_url") val audioPreviewUrl: String? = null,
83-
val description: String,
83+
val description: String? = null,
8484
@SerialName("duration_ms") val durationMs: Int,
8585
val explicit: Boolean,
8686
@SerialName("external_urls") override val externalUrlsString: Map<String, String>,

src/commonMain/kotlin/com.adamratzman.spotify/models/Show.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public data class SimpleShow(
2828
@SerialName("available_markets") private val availableMarketsString: List<String> = listOf(),
2929
@SerialName("external_urls") override val externalUrlsString: Map<String, String>,
3030
val copyrights: List<SpotifyCopyright>,
31-
val description: String,
31+
val description: String? = null,
3232
val explicit: Boolean,
3333
override val href: String,
3434
override val id: String,
@@ -74,7 +74,7 @@ public data class SimpleShow(
7474
public data class Show(
7575
@SerialName("available_markets") private val availableMarketsString: List<String> = listOf(),
7676
val copyrights: List<SpotifyCopyright>,
77-
val description: String,
77+
val description: String? = null,
7878
val explicit: Boolean,
7979
val episodes: NullablePagingObject<SimpleEpisode>,
8080
@SerialName("external_urls") override val externalUrlsString: Map<String, String>,

src/commonMain/kotlin/com.adamratzman.spotify/models/serialization/SerializationUtils.kt

Lines changed: 95 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,28 @@ import kotlinx.serialization.json.Json
1818
import kotlinx.serialization.json.JsonElement
1919
import kotlinx.serialization.json.JsonObject
2020

21-
internal val nonstrictJson =
22-
Json {
23-
isLenient = true
24-
ignoreUnknownKeys = true
25-
allowSpecialFloatingPointValues = true
26-
useArrayPolymorphism = true
27-
}
21+
internal val nonstrictJson = Json {
22+
isLenient = true
23+
ignoreUnknownKeys = true
24+
allowSpecialFloatingPointValues = true
25+
useArrayPolymorphism = true
26+
}
2827

29-
internal inline fun <reified T : Any> String.toObjectNullable(serializer: KSerializer<T>, api: GenericSpotifyApi?, json: Json): T? = try {
28+
internal inline fun <reified T : Any> String.toObjectNullable(
29+
serializer: KSerializer<T>,
30+
api: GenericSpotifyApi?,
31+
json: Json
32+
): T? = try {
3033
toObject(serializer, api, json)
3134
} catch (e: Exception) {
3235
null
3336
}
3437

35-
internal inline fun <reified T : Any> String.toObject(serializer: KSerializer<T>, api: GenericSpotifyApi?, json: Json): T {
38+
internal inline fun <reified T : Any> String.toObject(
39+
serializer: KSerializer<T>,
40+
api: GenericSpotifyApi?,
41+
json: Json
42+
): T {
3643
return this.parseJson {
3744
val obj = json.decodeFromString(serializer, this)
3845
api?.let {
@@ -44,7 +51,11 @@ internal inline fun <reified T : Any> String.toObject(serializer: KSerializer<T>
4451
}
4552
}
4653

47-
internal inline fun <reified T> String.toList(serializer: KSerializer<List<T>>, api: GenericSpotifyApi?, json: Json): List<T> {
54+
internal inline fun <reified T> String.toList(
55+
serializer: KSerializer<List<T>>,
56+
api: GenericSpotifyApi?,
57+
json: Json
58+
): List<T> {
4859
return this.parseJson {
4960
json.decodeFromString(serializer, this).apply {
5061
if (api != null) {
@@ -72,15 +83,15 @@ internal fun <T : Any> String.toPagingObject(
7283
json.decodeFromString(MapSerializer(t.first, t.second), this)
7384
}
7485
return (map[innerObjectName] ?: if (arbitraryInnerNameAllowed) map.keys.firstOrNull()?.let { map[it] }
75-
?: error("") else error(""))
76-
.apply {
77-
this.endpoint = endpoint
78-
this.itemClazz = tClazz
79-
this.items.map { obj ->
80-
if (obj is NeedsApi) obj.api = endpoint.api
81-
if (obj is PagingObjectBase<*, *>) obj.endpoint = endpoint
82-
}
86+
?: error("") else error(""))
87+
.apply {
88+
this.endpoint = endpoint
89+
this.itemClazz = tClazz
90+
this.items.map { obj ->
91+
if (obj is NeedsApi) obj.api = endpoint.api
92+
if (obj is PagingObjectBase<*, *>) obj.endpoint = endpoint
8393
}
94+
}
8495
}
8596

8697
return try {
@@ -97,19 +108,23 @@ internal fun <T : Any> String.toPagingObject(
97108
} catch (jde: SpotifyException.ParseException) {
98109
if (arbitraryInnerNameAllowed && jde.message?.contains("unable to parse", true) == true) {
99110
toPagingObject(
100-
tClazz,
101-
tSerializer,
102-
innerObjectName,
103-
endpoint,
104-
json,
105-
arbitraryInnerNameAllowed = true,
106-
skipInnerNameFirstIfPossible = false
111+
tClazz,
112+
tSerializer,
113+
innerObjectName,
114+
endpoint,
115+
json,
116+
arbitraryInnerNameAllowed = true,
117+
skipInnerNameFirstIfPossible = false
107118
)
108119
} else throw jde
109120
}
110121
}
111122

112-
internal fun <T : Any> initPagingObject(tClazz: KClass<T>, pagingObject: PagingObjectBase<T, *>, endpoint: SpotifyEndpoint) {
123+
internal fun <T : Any> initPagingObject(
124+
tClazz: KClass<T>,
125+
pagingObject: PagingObjectBase<T, *>,
126+
endpoint: SpotifyEndpoint
127+
) {
113128
pagingObject.apply {
114129
this.endpoint = endpoint
115130
this.itemClazz = tClazz
@@ -127,7 +142,14 @@ internal inline fun <reified T : Any> String.toPagingObject(
127142
json: Json,
128143
arbitraryInnerNameAllowed: Boolean = false,
129144
skipInnerNameFirstIfPossible: Boolean = true
130-
): PagingObject<T> = toNullablePagingObject(tSerializer, innerObjectName, endpoint, json, arbitraryInnerNameAllowed, skipInnerNameFirstIfPossible).toPagingObject()
145+
): PagingObject<T> = toNullablePagingObject(
146+
tSerializer,
147+
innerObjectName,
148+
endpoint,
149+
json,
150+
arbitraryInnerNameAllowed,
151+
skipInnerNameFirstIfPossible
152+
).toPagingObject()
131153

132154
internal inline fun <reified T : Any> String.toNullablePagingObject(
133155
tSerializer: KSerializer<T>,
@@ -136,7 +158,15 @@ internal inline fun <reified T : Any> String.toNullablePagingObject(
136158
json: Json,
137159
arbitraryInnerNameAllowed: Boolean = false,
138160
skipInnerNameFirstIfPossible: Boolean = true
139-
): NullablePagingObject<T> = toPagingObject(T::class, tSerializer, innerObjectName, endpoint, json, arbitraryInnerNameAllowed, skipInnerNameFirstIfPossible)
161+
): NullablePagingObject<T> = toPagingObject(
162+
T::class,
163+
tSerializer,
164+
innerObjectName,
165+
endpoint,
166+
json,
167+
arbitraryInnerNameAllowed,
168+
skipInnerNameFirstIfPossible
169+
)
140170

141171
internal fun <T : Any> String.toCursorBasedPagingObject(
142172
tClazz: KClass<T>,
@@ -153,25 +183,26 @@ internal fun <T : Any> String.toCursorBasedPagingObject(
153183
json.decodeFromString(MapSerializer(t.first, t.second), this)
154184
}
155185
return (map[innerObjectName] ?: if (arbitraryInnerNameAllowed) map.keys.firstOrNull()?.let { map[it] }
156-
?: error("") else error(""))
157-
.apply { initPagingObject(tClazz, this, endpoint) }
186+
?: error("") else error(""))
187+
.apply { initPagingObject(tClazz, this, endpoint) }
158188
}
159189
return try {
160-
val pagingObject = this.parseJson { json.decodeFromString(CursorBasedPagingObject.serializer(tSerializer), this) }
190+
val pagingObject =
191+
this.parseJson { json.decodeFromString(CursorBasedPagingObject.serializer(tSerializer), this) }
161192

162193
initPagingObject(tClazz, pagingObject, endpoint)
163194

164195
pagingObject
165196
} catch (jde: SpotifyException.ParseException) {
166197
if (!arbitraryInnerNameAllowed && jde.message?.contains("unable to parse", true) == true) {
167198
toCursorBasedPagingObject(
168-
tClazz,
169-
tSerializer,
170-
innerObjectName,
171-
endpoint,
172-
json,
173-
arbitraryInnerNameAllowed = true,
174-
skipInnerNameFirstIfPossible = false
199+
tClazz,
200+
tSerializer,
201+
innerObjectName,
202+
endpoint,
203+
json,
204+
arbitraryInnerNameAllowed = true,
205+
skipInnerNameFirstIfPossible = false
175206
)
176207
} else throw jde
177208
}
@@ -185,7 +216,15 @@ internal inline fun <reified T : Any> String.toCursorBasedPagingObject(
185216
arbitraryInnerNameAllowed: Boolean = false,
186217
skipInnerNameFirstIfPossible: Boolean = true
187218
): CursorBasedPagingObject<T> =
188-
toCursorBasedPagingObject(T::class, tSerializer, innerObjectName, endpoint, json, arbitraryInnerNameAllowed, skipInnerNameFirstIfPossible)
219+
toCursorBasedPagingObject(
220+
T::class,
221+
tSerializer,
222+
innerObjectName,
223+
endpoint,
224+
json,
225+
arbitraryInnerNameAllowed,
226+
skipInnerNameFirstIfPossible
227+
)
189228

190229
internal inline fun <reified T> String.toInnerObject(serializer: KSerializer<T>, innerName: String, json: Json): T {
191230
val map = this.parseJson {
@@ -195,7 +234,11 @@ internal inline fun <reified T> String.toInnerObject(serializer: KSerializer<T>,
195234
return (map[innerName] ?: error("Inner object with name $innerName doesn't exist in $map"))
196235
}
197236

198-
internal inline fun <reified T> String.toInnerArray(serializer: KSerializer<List<T>>, innerName: String, json: Json): List<T> {
237+
internal inline fun <reified T> String.toInnerArray(
238+
serializer: KSerializer<List<T>>,
239+
innerName: String,
240+
json: Json
241+
): List<T> {
199242
val map = this.parseJson {
200243
val t = (String.serializer() to serializer)
201244
json.decodeFromString(MapSerializer(t.first, t.second), this)
@@ -205,17 +248,20 @@ internal inline fun <reified T> String.toInnerArray(serializer: KSerializer<List
205248

206249
internal fun Map<String, JsonElement>.toJson() = JsonObject(this).toString()
207250

208-
internal fun <A, B> createMapSerializer(aSerializer: KSerializer<A>, bSerializer: KSerializer<B>): KSerializer<Map<A, B>> {
251+
internal fun <A, B> createMapSerializer(
252+
aSerializer: KSerializer<A>,
253+
bSerializer: KSerializer<B>
254+
): KSerializer<Map<A, B>> {
209255
val t = (aSerializer to bSerializer)
210256
return MapSerializer(t.first, t.second)
211257
}
212258

213259
internal fun <T> String.parseJson(producer: String.() -> T): T =
214-
try {
215-
producer(this)
216-
} catch (e: Exception) {
217-
throw SpotifyException.ParseException(
218-
"Unable to parse $this",
219-
e
220-
)
221-
}
260+
try {
261+
producer(this)
262+
} catch (e: Exception) {
263+
throw SpotifyException.ParseException(
264+
"Unable to parse $this",
265+
e
266+
)
267+
}

0 commit comments

Comments
 (0)