How to access parameter list of case class in a dotty macro

I am trying to learn meta-programming in dotty. Specifically compile time code generation. I thought learning by building something would be a good approach. So I decided to make a CSV parser which will parse lines into case classes. I want to use dotty macros to generate decoders

trait Decoder[T]{
  def decode(str:String):Either[ParseError, T]
}

object Decoder {
  inline given stringDec as Decoder[String] = new Decoder[String] {
    override def decode(str: String): Either[ParseError, String] = Right(str)
  }

  inline given intDec as Decoder[Int] = new Decoder[Int] {
    override def decode(str: String): Either[ParseError, Int] =
      str.toIntOption.toRight(ParseError(str, "value is not valid Int"))
  }
  
  inline def forType[T]:Decoder[T] = ${make[T]}

  def make[T:Type](using qctx: QuoteContext):Expr[Decoder[T]] = ???
}

I have provided basic decoders for Int & String , now I looking for guidance for def make[T:Type] method. How to iterate parameter list of a case class T inside this method? Are there any recommended ways or patterns to do this?

1 Like

I think you should use the type class derivation infrastructure for this. See http://dotty.epfl.ch/docs/reference/contextual/derivation.html and http://dotty.epfl.ch/docs/reference/contextual/derivation-macro.html.

2 Likes

Connected discussion
https://stackoverflow.com/questions/62853337/how-to-access-parameter-list-of-case-class-in-a-dotty-macro/

2 Likes

I added code with Dotty macros at SO.