All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cats.xml.generic.MagnoliaDecoder.scala Maven / Gradle / Ivy

//package cats.xml.generic
//
//import cats.data.NonEmptyList
//import cats.xml.*
//import cats.xml.codec.{Decoder, DecoderFailure}
//import cats.xml.cursor.{CursorFailure, FreeCursor}
//import cats.xml.generic.{Configuration, XmlElemType, XmlTypeInterpreter}
//import cats.xml.utils.generic.ParamName
//import magnolia1.*
//import magnolia1.CaseClass.Param
//
//import scala.deriving.Mirror
//
//object MagnoliaDecoder extends AutoDerivation[Decoder]:
//
//  import cats.syntax.all.given
//
//  val config: Configuration = Configuration.default
//
//  override def join[T](ctx: CaseClass[Typeclass, T]): Typeclass[T] =
//    if (ctx.isValueClass && config.unwrapValueClasses) {
//      ctx.params.head.typeclass.map(v => ctx.rawConstruct(Seq(v)))
//    } else {
//      val interpreter: XmlTypeInterpreter[T] = XmlTypeInterpreter[T]
//
//      Decoder
//        .fromCursor(c => {
//          ctx.params.toList
//            .mapFilter { (param: Param[Decoder, T]) =>
//              given Decoder[param.PType] = param.typeclass
//
//              interpreter
//                .evalParam(ParamName[T](param.label))
//                .mapFilter(paramInfo => {
//
//                  // normalize element label
//                  val normalizedLabel: String = paramInfo.labelMapper(param.label)
//
//                  // find and decoder element
//                  val result: Option[FreeCursor[param.PType]] = paramInfo.elemType match {
//                    case XmlElemType.Attribute => Some(c.attr(normalizedLabel).as[param.PType])
//                    case XmlElemType.Child     => Some(c.down(normalizedLabel).as[param.PType])
//                    case XmlElemType.Text      => Some(c.text.as[param.PType])
//                    case XmlElemType.Null      => None
//                  }
//
//                  // use fault parameter in case of missing element
//                  if (config.useDefaults)
//                    result.map(
//                      _.recoverWith(
//                        useDefaultParameterIfPresentToRecoverMissing[Decoder, T, param.PType](param)
//                      )
//                    )
//                  else
//                    result
//                })
//            }
//            .toList
//            .sequence
//            .map(ctx.rawConstruct)
//        })
//    }
//
//  override def split[T](ctx: SealedTrait[Typeclass, T]): Typeclass[T] =
//    Decoder.fromXml(xml => {
//      val subtypeTypeClass: Option[SealedTrait.Subtype[Typeclass, T, _]] = xml match
//        case node: XmlNode =>
//          ctx.subtypes.toList.find(_.typeInfo.short == node.label)
//        case _ =>
//          ctx.subtypes.headOption
//
//      subtypeTypeClass.map(_.typeclass.decode(xml)) match
//        case Some(result) => result
//        case None =>
//          DecoderFailure
//            .Custom(
//              s"Cannot find a valid subtype for sealed trait ${ctx.typeInfo.toString}"
//            )
//            .invalidNel
//    })
//
//  // Internal error: unable to find the outer accessor symbol of class $read
//  private def useDefaultParameterIfPresentToRecoverMissing[F[_], T, PT](
//    param: Param[F, T]
//  ): PartialFunction[NonEmptyList[CursorFailure], FreeCursor[PT]] = { failures =>
//    if (failures.forall(_.isMissing))
//      param.default match {
//        case Some(value) =>
//          FreeCursor.const[Xml, PT](value.asInstanceOf[PT].validNel[CursorFailure])
//        case None => FreeCursor.failure(failures)
//      }
//    else
//      FreeCursor.failure(failures)
//  }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy