
vx.ProtoSplit.scala Maven / Gradle / Ivy
package wechat.protocol
import java.io.{File, PrintWriter}
import scala.io.Source
import scala.util.matching.Regex
/**
*
* @author Jun Tsai
* @since 2020-07-19
*/
object ProtoSplit{
val messagePattern: Regex = "(enum|message)\\s+([\\d\\w]+)\\s*\\{".r
val fieldPattern: Regex = "\\s*(repeated|optional|required)\\s+([\\d\\w]+)\\s+([\\d\\w]+)\\s*=\\s*\\d+;[^$]*$".r
val messageEndPattern: Regex = "(\\s*\\});*".r
def main(args: Array[String]): Unit = {
val stream=Source.fromFile("/Users/jcai/workspace/oss/wechatwebapi/Cilent/mm/mm.proto")
var fileWriter:PrintWriter = null
val fields = new StringBuilder
var imports = Set[String]()
var msgLine=""
stream.getLines().foreach { line =>
line match {
case messagePattern(_,messageName) =>
fields.clear()
imports = Set[String]()
fileWriter = new PrintWriter(new File("src/main/vx.v3/" + messageName + "Message.proto"))
fileWriter.println("syntax=\"proto2\";")
fileWriter.println("package wechat.protocol.protobuf;")
msgLine = line
case messageEndPattern(_) =>
if(fileWriter != null) {
imports.foreach(m=>{
fileWriter.print("import \"")
fileWriter.print(m)
fileWriter.println("Message.proto\";")
})
fileWriter.println(msgLine)
fileWriter.append(fields)
fileWriter.println("}")
fileWriter.close()
fileWriter = null
}
case fieldPattern(_, t, n) =>
if(!types.contains(t)){
imports += t
}
fields.append(line).append("\n")
case other =>
if(fileWriter == null && !line.trim.isEmpty){
println("ERROR::::",line)
}
if(other.contains("{")){
println("ERROR::::",line)
}
fields.append(other).append("\n")
}
}
}
val types = Array( "double", "float","int64", "uint64", "int32", "fixed64", "fixed32", "bool", "string", "group", "message", "bytes", "uint32", "enum", "sfixed32", "sfixed64", "sint32", "sint64")
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy