Lindenes
Lindenes

Reputation: 25

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]

Upvotes: 0

Views: 140

Answers (2)

Dmytro Mitin
Dmytro Mitin

Reputation: 51723

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

Upvotes: 1

Lindenes
Lindenes

Reputation: 25

after 4 hours and after 5 minutes after post i did this

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

Upvotes: 1

Related Questions