@@ -18,9 +18,7 @@ package org.scalasteward.core.data
18
18
19
19
import cats .Order
20
20
import cats .implicits .*
21
- import io .circe .generic .semiauto .*
22
- import io .circe .syntax .*
23
- import io .circe .{Decoder , Encoder , HCursor , Json }
21
+ import io .circe .{Decoder , Encoder }
24
22
import org .scalasteward .core .repoconfig .PullRequestGroup
25
23
import org .scalasteward .core .util
26
24
import org .scalasteward .core .util .Nel
@@ -198,66 +196,98 @@ object Update {
198
196
}
199
197
}
200
198
201
- // TODO: Derive all instances of `Encoder`/`Decoder` here using `deriveCodec`
202
- // Partially manually implemented so we don't fail reading old caches (those
203
- // still using `Single`/`Group`)
199
+ implicit val SingleOrder : Order [Single ] =
200
+ Order .by((u : Single ) => (u.crossDependencies, u.newerVersions))
204
201
205
- implicit val ForArtifactIdEncoder : Encoder [ForArtifactId ] = {
206
- val derived = deriveEncoder[ForArtifactId ]
202
+ // Encoder and Decoder instances
207
203
208
- derived.mapJson(json => Json .obj(" ForArtifactId" -> json))
209
- }
204
+ // ForArtifactId
210
205
211
- implicit val ForArtifactIdDecoder : Decoder [ForArtifactId ] = {
212
- val derived = deriveDecoder [ForArtifactId ]
213
- derived
214
- .prepare(_.downField( " ForArtifactId " ) )
215
- .or(derived.prepare(_.downField( " Single " )))
216
- }
206
+ implicit private val forArtifactIdEncoder : Encoder [ForArtifactId ] =
207
+ Encoder .forProduct1( " ForArtifactId " )(identity [ForArtifactId ]) {
208
+ Encoder .forProduct4( " crossDependency " , " newerVersions " , " newerGroupId " , " newerArtifactId " ) {
209
+ s => (s.crossDependency, s.newerVersions, s.newerGroupId, s.newerArtifactId )
210
+ }
211
+ }
217
212
218
- implicit val ForGroupIdEncoder : Encoder [ForGroupId ] = {
219
- val derived = deriveEncoder[ForGroupId ]
213
+ private val unwrappedForArtifactIdDecoder : Decoder [ForArtifactId ] =
214
+ Decoder .forProduct4(" crossDependency" , " newerVersions" , " newerGroupId" , " newerArtifactId" ) {
215
+ (
216
+ crossDependency : CrossDependency ,
217
+ newerVersions : Nel [Version ],
218
+ newerGroupId : Option [GroupId ],
219
+ newerArtifactId : Option [String ]
220
+ ) =>
221
+ ForArtifactId (crossDependency, newerVersions, newerGroupId, newerArtifactId)
222
+ }
220
223
221
- derived.mapJson(json => Json .obj( " ForGroupId " -> json))
222
- }
224
+ private val forArtifactIdDecoderV1 : Decoder [ ForArtifactId ] =
225
+ Decoder .forProduct1( " Single " )(identity[ ForArtifactId ])(unwrappedForArtifactIdDecoder)
223
226
224
- private val oldForGroupIdDecoder : Decoder [ForGroupId ] =
225
- (c : HCursor ) =>
226
- for {
227
- crossDependencies <- c.downField(" crossDependencies" ).as[Nel [CrossDependency ]]
228
- newerVersions <- c.downField(" newerVersions" ).as[Nel [Version ]]
229
- forArtifactIds = crossDependencies
230
- .map(crossDependency => ForArtifactId (crossDependency, newerVersions))
231
- } yield ForGroupId (forArtifactIds)
232
-
233
- implicit val ForGroupIdDecoder : Decoder [ForGroupId ] =
234
- deriveDecoder[ForGroupId ]
235
- .prepare(_.downField(" ForGroupId" ))
236
- .or(oldForGroupIdDecoder.prepare(_.downField(" ForGroupId" )))
237
- .or(oldForGroupIdDecoder.prepare(_.downField(" Group" )))
238
-
239
- implicit val GroupedEncoder : Encoder [Grouped ] = {
240
- val derived = deriveEncoder[Grouped ]
241
-
242
- derived.mapJson(json => Json .obj(" Grouped" -> json))
243
- }
227
+ private val forArtifactIdDecoderV2 =
228
+ Decoder .forProduct1(" ForArtifactId" )(identity[ForArtifactId ])(unwrappedForArtifactIdDecoder)
244
229
245
- implicit val GroupedDecoder : Decoder [Grouped ] =
246
- deriveDecoder[ Grouped ].prepare(_.downField( " Grouped " ) )
230
+ implicit private val forArtifactIdDecoder : Decoder [ForArtifactId ] =
231
+ forArtifactIdDecoderV2.or(forArtifactIdDecoderV1 )
247
232
248
- implicit val SingleOrder : Order [Single ] =
249
- Order .by((u : Single ) => (u.crossDependencies, u.newerVersions))
233
+ // ForGroupId
234
+
235
+ private val forGroupIdEncoder : Encoder [ForGroupId ] =
236
+ Encoder .forProduct1(" ForGroupId" )(identity[ForGroupId ]) {
237
+ Encoder .forProduct1(" forArtifactIds" )(_.forArtifactIds)
238
+ }
239
+
240
+ private val unwrappedForGroupIdDecoderV1 : Decoder [ForGroupId ] =
241
+ Decoder .forProduct2(" crossDependencies" , " newerVersions" ) {
242
+ (crossDependencies : Nel [CrossDependency ], newerVersions : Nel [Version ]) =>
243
+ val forArtifactIds =
244
+ crossDependencies.map(crossDependency => ForArtifactId (crossDependency, newerVersions))
245
+ ForGroupId (forArtifactIds)
246
+ }
250
247
251
- implicit val UpdateEncoder : Encoder [Update ] = {
252
- case update : Grouped => update.asJson
253
- case update : ForArtifactId => update.asJson
254
- case update : ForGroupId => update.asJson
248
+ private val unwrappedForGroupIdDecoderV3 : Decoder [ForGroupId ] =
249
+ Decoder .forProduct1(" forArtifactIds" ) { (forArtifactIds : Nel [ForArtifactId ]) =>
250
+ ForGroupId (forArtifactIds)
251
+ }
252
+
253
+ private val forGroupIdDecoderV1 : Decoder [ForGroupId ] =
254
+ Decoder .forProduct1(" Group" )(identity[ForGroupId ])(unwrappedForGroupIdDecoderV1)
255
+
256
+ private val forGroupIdDecoderV2 : Decoder [ForGroupId ] =
257
+ Decoder .forProduct1(" ForGroupId" )(identity[ForGroupId ])(unwrappedForGroupIdDecoderV1)
258
+
259
+ private val forGroupIdDecoderV3 : Decoder [ForGroupId ] =
260
+ Decoder .forProduct1(" ForGroupId" )(identity[ForGroupId ])(unwrappedForGroupIdDecoderV3)
261
+
262
+ private val forGroupIdDecoder : Decoder [ForGroupId ] =
263
+ forGroupIdDecoderV3.or(forGroupIdDecoderV2).or(forGroupIdDecoderV1)
264
+
265
+ // Grouped
266
+
267
+ private val groupedEncoder : Encoder [Grouped ] =
268
+ Encoder .forProduct1(" Grouped" )(identity[Grouped ]) {
269
+ Encoder .forProduct3(" name" , " title" , " updates" )(s => (s.name, s.title, s.updates))
270
+ }
271
+
272
+ private val groupedDecoder : Decoder [Grouped ] =
273
+ Decoder .forProduct1(" Grouped" )(identity[Grouped ]) {
274
+ Decoder .forProduct3(" name" , " title" , " updates" ) {
275
+ (name : String , title : Option [String ], updates : List [ForArtifactId ]) =>
276
+ Grouped (name, title, updates)
277
+ }
278
+ }
279
+
280
+ // Update
281
+
282
+ implicit val updateEncoder : Encoder [Update ] = {
283
+ case update : ForArtifactId => forArtifactIdEncoder.apply(update)
284
+ case update : ForGroupId => forGroupIdEncoder.apply(update)
285
+ case update : Grouped => groupedEncoder.apply(update)
255
286
}
256
287
257
- implicit val UpdateDecoder : Decoder [Update ] =
258
- ForArtifactIdDecoder
288
+ implicit val updateDecoder : Decoder [Update ] =
289
+ forArtifactIdDecoder
259
290
.widen[Update ]
260
- .or(ForGroupIdDecoder .widen[Update ])
261
- .or(Decoder [Grouped ].widen[Update ])
262
-
291
+ .or(forGroupIdDecoder.widen[Update ])
292
+ .or(groupedDecoder.widen[Update ])
263
293
}
0 commit comments