in protobuf/src/main/scala/magnolify/protobuf/ProtobufType.scala [213:242]
private def aux2[T, Repr](_default: T)(f: Repr => T)(g: T => Repr): ProtobufField[T] =
aux[T, Repr, Repr](_default)(f)(g)
private def id[T](_default: T): ProtobufField[T] = aux[T, T, T](_default)(identity)(identity)
implicit val pfBoolean: ProtobufField[Boolean] = id[Boolean](false)
implicit val pfInt: ProtobufField[Int] = id[Int](0)
implicit val pfLong: ProtobufField[Long] = id[Long](0L)
implicit val pfFloat: ProtobufField[Float] = id[Float](0.0f)
implicit val pfDouble: ProtobufField[Double] = id[Double](0.0)
implicit val pfString: ProtobufField[String] = id[String]("")
implicit val pfByteString: ProtobufField[ByteString] = id[ByteString](ByteString.EMPTY)
implicit val pfByteArray: ProtobufField[Array[Byte]] =
aux2[Array[Byte], ByteString](Array.emptyByteArray)(b => b.toByteArray)(ByteString.copyFrom)
implicit def `enum`[T, E <: Enum[E] with ProtocolMessageEnum](implicit
et: EnumType[T],
ct: ClassTag[E]
): ProtobufField[T] = {
val map = ct.runtimeClass
.getMethod("values")
.invoke(null)
.asInstanceOf[Array[E]]
.map(e => e.name() -> e)
.toMap
val default = et.from(map.values.find(_.getNumber == 0).get.name())
aux2[T, EnumValueDescriptor](default)(e => et.from(e.getName))(e =>
map(et.to(e)).getValueDescriptor
)
}