This commit is contained in:
david 2024-02-11 01:36:12 +08:00
commit e923d85241
7 changed files with 456 additions and 0 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# merge
merge mult protot file.

134
gen.proto Normal file
View File

@ -0,0 +1,134 @@
syntax = "proto3";
package passport;
option go_package = "./passport";
// D:\work\bsm\bsm-tools\merge\proto\a.proto START
// Passport--
service Login{
//
rpc Pwd(LoginByPwdRequest) returns (LoginReply) {}
//
rpc Code(LoginByCodeRequest) returns (LoginReply) {}
// Wechat登录
rpc WeChatByCode(WeChatByCodeRequest) returns (WeChatByCodeReply) {}
rpc WeChatByPhone(WeChatByPhoneRequest) returns (WeChatByPhoneReply) {}
rpc WeChatGetUserinfo(WeChatByPhoneRequest) returns (WeChatGetUserinfoReply) {}
// AppleID登录
rpc AppleID(LoginByAppleIDRequest) returns (LoginReply) {}
//
rpc CodeAndRegister(LoginByCodeRequest) returns (LoginReply) {}
}
message LoginByPwdRequest {
string account = 1; //
string password = 2; //
string device = 3; //
}
message LoginByCodeRequest {
string country = 1; //
string phone = 2; //
string code = 3; //
string device = 4;//
}
message WeChatByCodeRequest {
string code = 1; // WeChat code
int64 agency_id=2; // ID
int64 staff_id=3; // ID
}
message WeChatByPhoneReply {
string account = 1; // WeChat code
}
message WeChatByCodeReply {
string session_key = 1; // WeChat session key
string open_id = 2; // WeChat open id
string identity = 3; // identity
string account = 4; // account
}
message WeChatByPhoneRequest {
string session_key = 1; // WeChat session key
string open_id = 2; // open_id
string data = 3; // data
string iv = 4; // iv
string identity = 5; // identiy
}
message WeChatGetUserinfoReply {
int64 id=1;
string account=2;
string identity=3;
string nickname=4;
string avatar=5;
string rights=6;
string token=7;
}
message LoginByAppleIDRequest {
string apple_id = 1; // apple id
string desc = 2; //
string device = 3;//
}
message LoginReply {
string identity = 1; //
string data_bind = 2; // ,PASS通过NOPHONE没有绑定手机号NOPWD没有设置密码NOBIND没有手机号同时没有密码
string token = 3; //
map<string, string> extend = 4; //
}
// END
// D:\work\bsm\bsm-tools\merge\proto\b.proto START
// Passport--
service Register{
//
rpc Pwd(RegisterRequest) returns (RegisterReply) {}
//
rpc Code(RegisterRequest) returns (RegisterReply) {}
// Wechat注册
rpc WeChat(RegisterRequest) returns (RegisterReply) {}
// AppleID注册
rpc AppleID(RegisterRequest) returns (RegisterReply) {}
}
message RegisterRequest {
string origin = 1; //
string account = 2; //
string phone = 3; //
string password = 4; //
string code = 5; //
string wechat_union_id = 6; //UnionID
string wechat_open_id = 7; //OpenID
string apple_id = 8; //Apple ID
string nickname = 9; //
string type = 10; //
string device = 11; //
int64 agency_id=12; // ID
int64 staff_id=13; // ID
}
message RegisterReply {
string identity = 1; //
string data_bind = 2; // ,PASS通过NOPHONE没有绑定手机号NOPWD没有设置密码NOBIND没有手机号同时没有密码
string token = 3; //Header所需Token
map<string, string> extend = 4; //
}
// END

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module git.apinb.com/bsm-tools/proto-merge
go 1.21.0

185
main.go Normal file
View File

@ -0,0 +1,185 @@
package main
import (
"bufio"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
// merge ./*.proto auto_gen.proto
func main() {
if len(os.Args) < 2 {
fmt.Println("Args error, eg: proto-merge ./*.proto auto_gen.proto")
os.Exit(0)
} else {
in := os.Args[1]
out := os.Args[2]
fmt.Println("Merge In:", in, "Out:", out)
files, err := FindFilesByPattern(in)
if err != nil {
fmt.Println("Error:", err)
os.Exit(1)
}
files = IsPorotFile(files)
// 合并
var mergeLins []string
genHeader := make(map[string]string)
var protoHeader []string
protoHeader = append(protoHeader, "syntax = \"proto3\";")
for _, file := range files {
mergeLins = append(mergeLins, "")
mergeLins = append(mergeLins, "// "+file+" START")
header, lines := scanProtoFile(file)
mergeLins = append(mergeLins, lines...)
mergeLins = append(mergeLins, "// END")
mergeLins = append(mergeLins, "")
for key, val := range header {
genHeader[key] = val
}
}
for k, v := range genHeader {
if k == "package" {
protoHeader = append(protoHeader, v)
}
}
for k, v := range genHeader {
if k == "option" {
protoHeader = append(protoHeader, v)
}
}
var body []string
body = append(body, protoHeader...)
body = append(body, mergeLins...)
// 输出
err = StringToFile(out, strings.Join(body, "\n"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(1)
} else {
fmt.Println("Merge OK!")
}
}
}
// FindFilesByPattern takes a combined string of directory and pattern and returns a slice of matching file names.
func FindFilesByPattern(pathWithPattern string) ([]string, error) {
// 使用Glob函数查找匹配的文件
files, err := filepath.Glob(pathWithPattern)
if err != nil {
return nil, err // 如果发生错误,返回错误信息
}
// 返回文件名切片
baseFileName := filepath.Base(pathWithPattern)
absPath, err := filepath.Abs(pathWithPattern)
if err != nil {
fmt.Println("Error:", err)
os.Exit(1)
}
dirPath := strings.ReplaceAll(absPath, baseFileName, "")
for idx, v := range files {
bfn := filepath.Base(v)
files[idx] = dirPath + bfn
}
return files, nil
}
func IsPorotFile(in []string) []string {
var ok []string
for _, v := range in {
body, err := os.ReadFile(v)
if err != nil {
fmt.Println(err.Error())
}
if strings.Contains(string(body), "proto3") {
ok = append(ok, v)
}
}
return ok
}
func scanProtoFile(filePath string) (map[string]string, []string) {
file, err := os.Open(filePath)
if err != nil {
panic("无法打开文件")
}
defer file.Close()
scanner := bufio.NewScanner(file)
var bodys []string
var header map[string]string = make(map[string]string)
for scanner.Scan() {
line := scanner.Text()
/*
line = strings.Trim(line, "")
line = strings.ReplaceAll(line, "\r\n", "")
line = strings.ReplaceAll(line, "\n", "")
*/
//if line != "" {
key, isSysTag := containsSysTag(line)
if isSysTag {
header[key] = line
} else {
bodys = append(bodys, line)
}
//}
}
return header, bodys
}
func containsSysTag(line string) (string, bool) {
var tags []string = []string{"syntax", "package", "option", "import"}
for _, v := range tags {
if len(line) >= len(v) {
if line[0:len(v)] == v {
return v, true
}
}
}
return "", false
}
func StringToFile(path, content string) error {
startF, err := os.Create(path)
if err != nil {
return errors.New("os.Create create file " + path + " error:" + err.Error())
}
defer startF.Close()
_, err = io.WriteString(startF, content)
if err != nil {
return errors.New("io.WriteString to " + path + " error:" + err.Error())
}
return nil
}

88
proto/a.proto Normal file
View File

@ -0,0 +1,88 @@
syntax = "proto3";
package passport;
option go_package = "./passport";
// Passport--
service Login{
//
rpc Pwd(LoginByPwdRequest) returns (LoginReply) {}
//
rpc Code(LoginByCodeRequest) returns (LoginReply) {}
// Wechat登录
rpc WeChatByCode(WeChatByCodeRequest) returns (WeChatByCodeReply) {}
rpc WeChatByPhone(WeChatByPhoneRequest) returns (WeChatByPhoneReply) {}
rpc WeChatGetUserinfo(WeChatByPhoneRequest) returns (WeChatGetUserinfoReply) {}
// AppleID登录
rpc AppleID(LoginByAppleIDRequest) returns (LoginReply) {}
//
rpc CodeAndRegister(LoginByCodeRequest) returns (LoginReply) {}
}
message LoginByPwdRequest {
string account = 1; //
string password = 2; //
string device = 3; //
}
message LoginByCodeRequest {
string country = 1; //
string phone = 2; //
string code = 3; //
string device = 4;//
}
message WeChatByCodeRequest {
string code = 1; // WeChat code
int64 agency_id=2; // ID
int64 staff_id=3; // ID
}
message WeChatByPhoneReply {
string account = 1; // WeChat code
}
message WeChatByCodeReply {
string session_key = 1; // WeChat session key
string open_id = 2; // WeChat open id
string identity = 3; // identity
string account = 4; // account
}
message WeChatByPhoneRequest {
string session_key = 1; // WeChat session key
string open_id = 2; // open_id
string data = 3; // data
string iv = 4; // iv
string identity = 5; // identiy
}
message WeChatGetUserinfoReply {
int64 id=1;
string account=2;
string identity=3;
string nickname=4;
string avatar=5;
string rights=6;
string token=7;
}
message LoginByAppleIDRequest {
string apple_id = 1; // apple id
string desc = 2; //
string device = 3;//
}
message LoginReply {
string identity = 1; //
string data_bind = 2; // ,PASS通过NOPHONE没有绑定手机号NOPWD没有设置密码NOBIND没有手机号同时没有密码
string token = 3; //
map<string, string> extend = 4; //
}

42
proto/b.proto Normal file
View File

@ -0,0 +1,42 @@
syntax = "proto3";
package passport;
option go_package = "./passport";
// Passport--
service Register{
//
rpc Pwd(RegisterRequest) returns (RegisterReply) {}
//
rpc Code(RegisterRequest) returns (RegisterReply) {}
// Wechat注册
rpc WeChat(RegisterRequest) returns (RegisterReply) {}
// AppleID注册
rpc AppleID(RegisterRequest) returns (RegisterReply) {}
}
message RegisterRequest {
string origin = 1; //
string account = 2; //
string phone = 3; //
string password = 4; //
string code = 5; //
string wechat_union_id = 6; //UnionID
string wechat_open_id = 7; //OpenID
string apple_id = 8; //Apple ID
string nickname = 9; //
string type = 10; //
string device = 11; //
int64 agency_id=12; // ID
int64 staff_id=13; // ID
}
message RegisterReply {
string identity = 1; //
string data_bind = 2; // ,PASS通过NOPHONE没有绑定手机号NOPWD没有设置密码NOBIND没有手机号同时没有密码
string token = 3; //Header所需Token
map<string, string> extend = 4; //
}

1
proto/c.txt Normal file
View File

@ -0,0 +1 @@
this is test file