All Downloads are FREE. Search and download functionalities are using the official Maven repository.

vx.ProtoSplit.scala Maven / Gradle / Ivy

There is a newer version: 8.0.48.01
Show newest version
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