Как получить доступ к значениям по умолчанию для полей класса дела?

Я хочу получить экземпляры некоторого типа (Decoder[A]) для произвольных классов с использованием shapeless.

trait Decoder[A] extends Serializable { self =>
  def decode(source: String): Either[Throwable, A]
}

Если я не рассматриваю значения по умолчанию для класса case, тогда все идет хорошо, используя базовый подход:

  final implicit def genericDecoder[A, H <: HList](
    implicit gen: LabelledGeneric.Aux[A, H],
    hDecoder: Lazy[Decoder[H]]
  ): Decoder[A] = value => hDecoder.value.decode(value).map(gen.from)

  final implicit val hnilDecoder: Decoder[HNil] = ???

  final implicit def hlistDecoder[K <: Symbol, H, T <: HList](
    implicit witness: Witness.Aux[K],
    hDecoder: Lazy[Decoder[H]],
    tDecoder: Lazy[Decoder[T]]
  ): Decoder[FieldType[K, H] :: T] = ???

Теперь я хочу иметь возможность использовать значение по умолчанию для поля, которое не может быть декодировано. В этом случае я попробовал этот подход (добавить дополнительный уровень абстракции):

trait DecoderWithDefaults[A, B] extends Serializable {
  def decode(value: String, defaults: B): Either[Throwable, A]
}

  final implicit def genericDecoder[A, H <: HList, HD <: HList](
    implicit gen: LabelledGeneric.Aux[A, H],
    defaults: Default.AsOptions.Aux[A, HD],
    hDecoder: Lazy[DecoderWithDefaults[H, HD]]
  ): Decoder[A] = value => hDecoder.value.decode(value, defaults()).map(gen.from)

  final implicit val hnilDecoder: DecoderWithDefaults[HNil, HNil] = (_, _) => Right(HNil)

  final implicit def hlistDecoder[K <: Symbol, H, T <: HList, TD <: HList](
    implicit witness: Witness.Aux[K],
    hDecoder: Lazy[DecoderWithDefaults[H, Option[H]]],
    tDecoder: Lazy[DecoderWithDefaults[T, TD]]
  ): DecoderWithDefaults[FieldType[K, H] :: T, Option[H] :: TD] = ???

Итак, мой вопрос: можно ли добиться того же, но без использования дополнительного уровня абстракции (например, DecoderWithDefaultsв этом случае)? Что-то типа:

  final implicit def hlistDecoder[K <: Symbol, H, T <: HList](
    implicit witness: Witness.Aux[K],
    defaultValueHead: Option[H],
    hDecoder: Lazy[Decoder[H]],
    tDecoder: Lazy[Decoder[T]]
  ): Decoder[FieldType[K, H] :: T] = ???

0 ответов

Другие вопросы по тегам