def apply[M M): MessageDecoder[M] = reader => f()

in finagle-postgresql/src/main/scala/com/twitter/finagle/postgresql/transport/MessageDecoder.scala [102:140]


  def apply[M <: BackendMessage](f: PgBuf.Reader => M): MessageDecoder[M] = reader => f(reader)

  def readFields(reader: PgBuf.Reader): Map[Field, String] = {
    import Field._
    def nextField: Option[Field] =
      reader.byte().toChar match {
        case 0 => None
        case 'S' => Some(LocalizedSeverity)
        case 'V' => Some(Severity)
        case 'C' => Some(Code)
        case 'M' => Some(Message)
        case 'D' => Some(Detail)
        case 'H' => Some(Hint)
        case 'P' => Some(Position)
        case 'p' => Some(InternalPosition)
        case 'q' => Some(InternalQuery)
        case 'W' => Some(Where)
        case 's' => Some(Schema)
        case 't' => Some(Table)
        case 'c' => Some(Column)
        case 'd' => Some(DataType)
        case 'n' => Some(Constraint)
        case 'F' => Some(File)
        case 'L' => Some(Line)
        case 'R' => Some(Routine)
        case unk => Some(Unknown(unk))
      }

    @tailrec
    def loop(fields: Map[Field, String]): Map[Field, String] =
      nextField match {
        case None => fields
        case Some(field) =>
          val value = reader.cstring()
          loop(fields + (field -> value))
      }

    loop(Map.empty)
  }