Search code examples
scalainlinescala-3generic-derivation

scala 3 get field types of case class


I try get head type and write it to List

transparent inline def getClassesFieldType[A](using p: Mirror.ProductOf[A]): List[String] =
    inline p match {
      case m: Mirror.ProductOf[A] =>
        summonFieldTypes[m.MirroredElemTypes]
    }

  transparent inline def summonFieldTypes[T <: Tuple]: List[String] =
    inline erasedValue[T] match {
      case _: (head *: tail) =>
        
      case _ => Nil
    }

i try this

transparent inline def getClassesFieldType[A](using p: Mirror.ProductOf[A]): List[String] =
    inline p match {
      case m: Mirror.ProductOf[A] =>
        summonFieldTypes[m.MirroredElemTypes]
    }

  transparent inline def summonFieldTypes[T <: Tuple]: List[String] =
    inline erasedValue[T] match {
      case _: (head *: tail) =>
        summonInline[head].toString :: summonFieldTypes[tail]
      case _ => Nil
    }

also i try this

transparent inline def getClassesFieldType[A](using p: Mirror.ProductOf[A]): List[String] =
    inline p match {
      case m: Mirror.ProductOf[A] =>
        summonFieldTypes[m.MirroredElemTypes]
    }

  transparent inline def summonFieldTypes[T <: Tuple]: List[String] =
    inline erasedValue[T] match {
      case _: (head *: tail) =>
        constValue[head].toString :: summonFieldTypes[tail]
      case _ => Nil
    }

but this dont work because different excaption like No given instance of type String was found getClassesFieldType[Tester] or not a constant type: String; cannot take constValue getClassesFieldType[Tester]


Solution

  • You can use type class Typeable from Shapeless-3

    import scala.compiletime.erasedValue
    import scala.deriving.Mirror
    import shapeless3.typeable.Typeable
    
    inline def getClassesFieldType[A](using p: Mirror.ProductOf[A]): List[String] =
      summonFieldTypes[p.MirroredElemTypes]
    
    inline def summonFieldTypes[T <: Tuple]: List[String] =
      inline erasedValue[T] match
        case _: (head *: tail) => Typeable[head].describe :: summonFieldTypes[tail]
        case _ => Nil
    

    https://scastie.scala-lang.org/DmytroMitin/FYv3PQYvTaKGe02xgoKTWg/1

    Printing MirroredElemTypes in Scala 3