Skip to content

Commit

Permalink
builder wip
Browse files Browse the repository at this point in the history
  • Loading branch information
thesamet committed Nov 14, 2020
1 parent 6897c58 commit 30cf569
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,17 @@ class ProtobufGenerator(
printer.addWithDelimiter(",")(constructorFields(message).map(_.fullString))
}

def generateBuilder(message: Descriptor)(printer: FunctionalPrinter): FunctionalPrinter = {
val myFullScalaName = message.scalaType.fullNameWithMaybeRoot(message)
printer.add(
s"class Builder extends _root_.scalapb.MessageBuilder[$myFullScalaName] {",
)
.indented(

)
.add("}")
}

def generateMerge(message: Descriptor)(printer: FunctionalPrinter): FunctionalPrinter = {
val myFullScalaName = message.scalaType.fullNameWithMaybeRoot(message)
val requiredFieldMap: Map[FieldDescriptor, Int] =
Expand Down Expand Up @@ -1339,6 +1350,7 @@ class ProtobufGenerator(
.call(generateNestedMessagesCompanions(message))
.call(generateEnumCompanionForField(message))
.call(generateDefaultInstance(message))
.call(generateBuilder(message))
.print(message.getEnumTypes.asScala)(printEnum)
.print(message.getRealOneofs.asScala)(printOneof)
.print(message.nestedTypes)(printMessage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import scalapb.lenses.{Lens, Updatable}
import _root_.scalapb.descriptors.{PMessage, PValue}
import scala.util.Try
import scala.annotation.nowarn
import scala.annotation.unused

trait GeneratedEnum extends Any with Product with Serializable {
type EnumType <: GeneratedEnum
Expand Down Expand Up @@ -137,6 +138,32 @@ trait GeneratedMessage extends Any with Serializable {
def toProtoString: String
}

abstract class MessageBuilder[A] {
def addInt(tag: Int, @unused value: Int): Unit = MessageBuilder.unmatchedTag(tag)

def addLong(tag: Int, @unused value: Long): Unit = MessageBuilder.unmatchedTag(tag)

def addFloat(tag: Int, @unused value: Float): Unit = MessageBuilder.unmatchedTag(tag)

def addDouble(tag: Int, @unused value: Double): Unit = MessageBuilder.unmatchedTag(tag)

def addString(tag: Int, @unused value: String): Unit = MessageBuilder.unmatchedTag(tag)

def addBoolean(tag: Int, @unused value: Boolean): Unit = MessageBuilder.unmatchedTag(tag)

def addEnumValue(tag: Int, @unused value: Int): Unit = MessageBuilder.unmatchedTag(tag)

def addByteString(tag: Int, @unused value: ByteString): Unit = MessageBuilder.unmatchedTag(tag)

def addMessage[T <: GeneratedMessage](tag: Int, @unused value: T): Unit = MessageBuilder.unmatchedTag(tag)

def result(): A
}

object MessageBuilder {
def unmatchedTag(tag: Int): Nothing = throw new RuntimeException(s"Unmatched tag $tag.")
}

trait ExtendableMessage[A <: ExtendableMessage[A]] extends Updatable[A] {
self: A =>
def unknownFields: _root_.scalapb.UnknownFieldSet
Expand Down

0 comments on commit 30cf569

Please sign in to comment.