def apply[T, MsgT <: Message]()

in protobuf/src/main/scala/magnolify/protobuf/ProtobufType.scala [42:67]


  def apply[T, MsgT <: Message](cm: CaseMapper)(implicit
    f: ProtobufField[T],
    ct: ClassTag[MsgT]
  ): ProtobufType[T, MsgT] = f match {
    case r: ProtobufField.Record[_] =>
      new ProtobufType[T, MsgT] {
        {
          val descriptor = ct.runtimeClass
            .getMethod("getDescriptor")
            .invoke(null)
            .asInstanceOf[Descriptor]

          r.checkDefaults(descriptor)(cm)
        }

        @transient private lazy val _newBuilder: Method = ct.runtimeClass.getMethod("newBuilder")
        private def newBuilder(): Message.Builder =
          _newBuilder.invoke(null).asInstanceOf[Message.Builder]

        private val caseMapper: CaseMapper = cm
        override def from(v: MsgT): T = r.from(v)(caseMapper)
        override def to(v: T): MsgT = r.to(v, newBuilder())(caseMapper).asInstanceOf[MsgT]
      }
    case _ =>
      throw new IllegalArgumentException(s"ProtobufType can only be created from Record. Got $f")
  }