skunk icon indicating copy to clipboard operation
skunk copied to clipboard

Document usage of *: / pmap. instead of. ~/ gmap for scala3

Open rssh opened this issue 3 years ago • 4 comments

scala 3.0.2 and 3.1.0-RC2 skunk: 0.2.2

code:

package x

import skunk.*
import skunk.implicits.{*,given}
import skunk.codec.all.{*,given}

case class S6(s1: String, s2: String, s3: String, s4: String, s5: String, s6: String)

case class S7(s1: String, s2: String, s3: String, s4: String, s5: String, s6: String, s7: String)

// works
def testFun6 =  {
  sql"""
   select s1,s2,s3,s4,s5,s6 from table
  """.query(varchar ~ varchar ~ varchar ~ varchar ~ varchar ~ varchar).gmap[S6]
}

// compile error
def testFun7 =  {
  sql"""
   select s1,s2,s3,s4,s5,s6,s7 from table
  """.query(varchar ~ varchar ~ varchar ~ varchar ~ varchar ~ varchar ~ varchar).gmap[S7]
}

Message:

error] -- Error: /Users/rssh/tests/misc/skunk/scase7/src/main/scala/x/X.scala:22:89 ---
[error] 22 |  """.query(varchar ~ varchar ~ varchar ~ varchar ~ varchar ~ varchar ~ varchar).gmap[S7]
[error]    |                                                                                         ^
[error]    |Cannot construct a mapping between the source (which must be a twiddle-list type) and the specified target type x.S7 (which must be a case class of the same structure)..
[error]    |I found:
[error]    |
[error]    |    <
[error]    |      <
[error]    |        <skunk.util.Twiddler.product6:
[error]    |          ([P <: Product, A, B, C, D, E, F]
[error]    |            (implicit m: deriving.Mirror.ProductOf[P], i: m.MirroredElemTypes =:= (A
[error]    |              , 
[error]    |            B, C, D, E, F)): 
[error]    |              skunk.util.Twiddler[P]{Out = (((((A, B), C), D), E), F)}
[error]    |          )
[error]    |        >
[error]    |      [x.S7, (String, String), String, String, String, String, String]:
[error]    |        ((implicit m: deriving.Mirror.ProductOf[x.S7], i: m.MirroredElemTypes =:= (
[error]    |          (String, String)
[error]    |        , String, String, String, String, String)): 
[error]    |          skunk.util.Twiddler[x.S7]{
[error]    |            Out = ((((((String, String), String), String), String), String), String)
[error]    |          }
[error]    |        )
[error]    |      >
[error]    |    (
[error]    |      <<<x.S7:x.S7>.$asInstanceOf:([X0] => X0)>[
[error]    |        (
[error]    |          deriving.Mirror.Product{
[error]    |            MirroredType = x.S7; MirroredMonoType = x.S7; MirroredElemTypes <: Tuple
[error]    |          }
[error]    |         & 
[error]    |          scala.deriving.Mirror.Product{
[error]    |            MirroredMonoType = x.S7; MirroredType = x.S7; 
[error]    |              MirroredLabel = ("S7" : String)
[error]    |          }
[error]    |        ){
[error]    |          MirroredElemTypes = (String, String, String, String, String, String, 
[error]    |            String
[error]    |          ); 
[error]    |            MirroredElemLabels = (("s1" : String), ("s2" : String), ("s3" : String)
[error]    |              , 
[error]    |            ("s4" : String), ("s5" : String), ("s6" : String), ("s7" : String))
[error]    |        }
[error]    |      ]:
[error]    |        (
[error]    |          deriving.Mirror.Product{
[error]    |            MirroredType = x.S7; MirroredMonoType = x.S7; MirroredElemTypes <: Tuple
[error]    |          }
[error]    |         & 
[error]    |          scala.deriving.Mirror.Product{
[error]    |            MirroredMonoType = x.S7; MirroredType = x.S7; 
[error]    |              MirroredLabel = ("S7" : String)
[error]    |          }
[error]    |        ){
[error]    |          MirroredElemTypes = (String, String, String, String, String, String, 
[error]    |            String
[error]    |          ); 
[error]    |            MirroredElemLabels = (("s1" : String), ("s2" : String), ("s3" : String)
[error]    |              , 
[error]    |            ("s4" : String), ("s5" : String), ("s6" : String), ("s7" : String))
[error]    |        }
[error]    |      >
[error]    |    , 
[error]    |      </* missing */
[error]    |        summon[(String, String, String, String, String, String, String) =:= ((String
[error]    |          , 
[error]    |        String), String, String, String, String, String)]
[error]    |      :
[error]    |        <error no implicit values were found that match type (String, String, String, String, String, String, String) =:= ((String, String), 
[error]    |      String
[error]    |    , String, String, String, String)>
[error]    |      >
[error]    |    ):
[error]    |      <error no implicit values were found that match type (String, String, String, String, String, String, String) =:= ((String, String), 
[error]    |      String
[error]    |    , String, String, String, String)>
[error]    |    >
[error]    |
[error]    |But no implicit values were found that match type (String, String, String, String, String, String, String) =:= ((String, String), 
[error]    |  String
[error]    |, String, String, String, String).
[error] one error found
[error] one error found
[error] (Compile / compileIncremental) Compilation failed

rssh avatar Oct 16 '21 07:10 rssh

scase7.tar.gz

full sbt project if needed.

rssh avatar Oct 16 '21 07:10 rssh

For scala3 it's better to use the following that uses tuples instead of hlist: (varchar *: varchar *: varchar *: varchar *: varchar *: varchar).pimap // pmap for decoder only this will solve the 6 limit issue

hnaderi avatar Oct 16 '21 08:10 hnaderi

thanks, [oops, find #434 ]. And looks like this requires extra brackets, otherwise pmap will be searched in Query

.query((varchar *: varchar *: varchar *: varchar *: varchar *: varchar).pimap)

rssh avatar Oct 16 '21 10:10 rssh

Thanks, yes, we do need to document this.

tpolecat avatar Oct 16 '21 15:10 tpolecat

Fixed by #846

mpilquist avatar May 02 '23 12:05 mpilquist