Size: a a a

Scala User Group

2021 June 04

VH

Vitalii Honta in Scala User Group
Тут почти все знатоки
источник

VS

Vladimir Sapronov in Scala User Group
Есть такой вопрос:

sealed trait OrderEvent
object OrderEvent {
 case class Created(data: OrderCreated) extends OrderEvent
 case class Changed(data: OrderChanged) extends OrderEvent
 case class Canceled(data: OrderCanceled) extends OrderEvent
}

Вот с такими кодеками:

implicit val encoderOrderEvent: Encoder[OrderEvent] = deriveConfiguredEncoder
implicit val decoderOrderEvent: Decoder[OrderEvent] = deriveConfiguredDecoder
implicit val encoderOrderEventCreated: Encoder[OrderEvent.Created] = deriveUnwrappedEncoder
implicit val decoderOrderEventCreated: Decoder[OrderEvent.Created] = deriveUnwrappedDecoder
implicit val encoderOrderEventChanged: Encoder[OrderEvent.Changed] = deriveUnwrappedEncoder
implicit val decoderOrderEventChanged: Decoder[OrderEvent.Changed] = deriveUnwrappedDecoder
implicit val encoderOrderEventCanceled: Encoder[OrderEvent.Canceled] = deriveUnwrappedEncoder
implicit val decoderOrderEventCanceled: Decoder[OrderEvent.Canceled] = deriveUnwrappedDecoder

Переваривает вот такой JSON:

{"Changed":{ ... < OrderChanged fields here >....}}
{"Created":{ ... < OrderCreated fields here >....}}

В JSON слова Changed и Created связаны с именами кейс-классов: Created и Changed. Эта связь управляемая:

Configuration.default.withSnakeCaseMemberNames.withSnakeCaseConstructorNames.withDefaults

Вот это вот withSnakeCaseConstructorNames - как раз управляет как имя конструктора будет выглядеть в JSON.

Проблема: надо не просто менять кейсинг, а кастомизировать это имя полностью:

@SomeMagic("IdontCareAboutNameOfCasesClassChanged")
case class Changed(data: OrderChanged) extends OrderEvent

{"IdontCareAboutNameOfCasesClassChanged":{ ... < OrderChanged fields here >....}}
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
чтобы работало нормальное форматирование нужно выделить текст, ткнуть пкм и выбрать трансформейшонс - моноспейс
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
в circe.magnolia было renaming :: String -> String
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
что значит, что можно произвольно менять
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
но не помню, применимо ли это к конструкторам
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
ща найду
источник

TT

Taika Tytto in Scala User Group
/scastie
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
https://github.com/vpavkin/circe-magnolia/blob/master/derivation/src/main/scala/io/circe/magnolia/configured/Configuration.scala#L37
Собственно вот как метод в конфигурации сделан, где snakeCaseTransformation : String => String
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
значит можно сделать

def WithNoCareOfNamesOrSomethingLikeConst: Configuration => Configuration = _.copy(
 transformConstructorNames = _ => «IdontCareAboutNameOfCasesClassChanged»
)
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
и использовать типа как

import derevo.derive
import derevo.circe.magnolia._
import io.circe.magnolia.configured.Configuration


@derive(customizableDecoder, customizableEncoder)
final case class Content(sections: Vector[Section])

object Content {
implicit val conf: Configuration =
 WithNoCareOfNamesOrSomethingLikeConst
(Configuration.default)
}
источник

VS

Vladimir Sapronov in Scala User Group
Не для конструкторов я могу: @JsonKey("Whatever"), проблема именно про конструкторы.
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
ну вот оказывается применимо
источник

VS

Vladimir Sapronov in Scala User Group
Займет время, но я сделаю. Просто хотел получить экспресс анализ.
источник

VS

Vladimir Sapronov in Scala User Group
А без дерева?
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
та я прост его показал так
источник

ΛВ

Λнтон Войцишевский... in Scala User Group
конфигурация то такая же
источник

VS

Vladimir Sapronov in Scala User Group
Но вообще погодите
источник

TT

Taika Tytto in Scala User Group
без дерева не входит в экспресс-анализ
источник

ZM

ZLoyer Matveev in Scala User Group
ужас! что такое говоришь!
источник