123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- package main
- import (
- "bufio"
- "fmt"
- "log"
- "os"
- "path"
- filepath "path/filepath"
- "regexp"
- "strings"
- )
- func main() {
- if len(os.Args) < 2 {
- os.Exit(1)
- }
- multi := false
- folder := false
- for i := 2; i < len(os.Args); i++ {
- if os.Args[i] == "MULTI" {
- multi = true
- folder = true //For multi-file generation folder-based approach is enabled by default and could not be switched off
- }
- if os.Args[i] == "FOLDER" {
- folder = true
- }
- }
- file, err := os.Open(os.Args[1])
- if err != nil {
- log.Fatal(err)
- }
- defer file.Close()
- messageFinder, err := regexp.Compile("^message\\s+([a-zA-Z0-9_]+)")
- if err != nil {
- log.Fatalf("Invalid regexp %s\n", err)
- }
- serviceFinder, err := regexp.Compile("^service\\s+([a-zA-Z0-9_]+)")
- if err != nil {
- log.Fatalf("Invalid regexp %s\n", err)
- }
- packageFinder, err := regexp.Compile("^package\\s+(.+);")
- if err != nil {
- log.Fatalf("Invalid regexp %s\n", err)
- }
- scanner := bufio.NewScanner(file)
- fullpath := ""
- for scanner.Scan() {
- capture := packageFinder.FindStringSubmatch(scanner.Text())
- if len(capture) == 2 {
- packages := strings.Split(capture[1], ".")
- fullpath = strings.Join(packages, "/")
- fullpath += "/"
- break
- }
- }
- newoffset, err := file.Seek(0, 0)
- if err != nil || newoffset != 0 {
- log.Fatal(err)
- }
- scanner = bufio.NewScanner(file)
- if multi {
- for scanner.Scan() {
- capture := messageFinder.FindStringSubmatch(scanner.Text())
- if len(capture) == 2 {
- fmt.Printf("%s%s.h;", fullpath, strings.ToLower(capture[1]))
- }
- capture = serviceFinder.FindStringSubmatch(scanner.Text())
- if len(capture) == 2 {
- fmt.Printf("%s%sclient.h;", fullpath, strings.ToLower(capture[1]))
- }
- }
- } else {
- //Singlefile version
- enumFinder, err := regexp.Compile("^enum\\s+([a-zA-Z0-9_]+)")
- if err != nil {
- log.Fatalf("Invalid regexp %s\n", err)
- }
- basename := path.Base(os.Args[1])
- basename = strings.TrimSuffix(basename, filepath.Ext(basename))
- messageFound := false
- serviceFound := false
- for scanner.Scan() {
- capture := messageFinder.FindStringSubmatch(scanner.Text())
- if len(capture) == 2 {
- messageFound = true
- }
- capture = enumFinder.FindStringSubmatch(scanner.Text())
- if len(capture) == 2 {
- messageFound = true
- }
- capture = serviceFinder.FindStringSubmatch(scanner.Text())
- if len(capture) == 2 {
- serviceFound = true
- }
- }
- if messageFound {
- if folder {
- fmt.Printf("%s%s.qpb.h;", fullpath, basename)
- } else {
- fmt.Printf("%s.qpb.h;", basename)
- }
- }
- if serviceFound {
- if folder {
- fmt.Printf("%s%s_grpc.qpb.h;", fullpath, basename)
- } else {
- fmt.Printf("%s_grpc.qpb.h;", basename)
- }
- }
- }
- if err := scanner.Err(); err != nil {
- log.Fatal(err)
- }
- }
|