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)
}