go-client/generator/main.go (174 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package main
import (
"bytes"
"encoding/csv"
"flag"
"fmt"
"io/ioutil"
"os"
"unicode"
)
func privateMethodName(methodName string) string {
return string(unicode.ToLower(rune(methodName[0]))) + methodName[1:]
}
func generateAdminRPC(rpcCode, rpcName, reqName, respName string) string {
s := "\n"
s += fmt.Sprintf("func (ms *metaSession) %s(ctx context.Context, req *admin.%s) (*admin.%s, error) {\n", privateMethodName(rpcName), reqName, respName)
s += fmt.Sprintf(" arg := admin.NewAdminClient%sArgs()\n", rpcName)
s += fmt.Sprintf(" arg.Req = req\n")
s += fmt.Sprintf(" result, err := ms.call(ctx, arg, \"%s\")\n", rpcCode)
s += fmt.Sprintf(" if err != nil {\n")
s += fmt.Sprintf(" return nil, fmt.Errorf(\"RPC to session %%s failed: %%s\", ms, err)\n")
s += fmt.Sprintf(" }\n")
s += fmt.Sprintf(" ret, _ := result.(*admin.AdminClient%sResult)\n", rpcName)
s += fmt.Sprintf(" return ret.GetSuccess(), nil\n")
s += fmt.Sprintf("}\n")
s += "\n"
s += fmt.Sprintf("// %s is auto-generated\n", rpcName)
s += fmt.Sprintf("func (m *MetaManager) %s(ctx context.Context, req *admin.%s) (*admin.%s, error) {\n", rpcName, reqName, respName)
s += fmt.Sprintf(" resp, err := m.call(ctx, func(rpcCtx context.Context, ms *metaSession) (metaResponse, error) {\n")
s += fmt.Sprintf(" return ms.%s(rpcCtx, req)\n", privateMethodName(rpcName))
s += fmt.Sprintf(" })\n")
s += fmt.Sprintf(" if err == nil {\n")
s += fmt.Sprintf(" if resp.GetErr().Errno != base.ERR_OK.String() {\n")
s += fmt.Sprintf(" return resp.(*admin.%s), fmt.Errorf(\"%s failed: %%s\", resp.GetErr().String())\n", respName, rpcName)
s += fmt.Sprintf(" }\n")
s += fmt.Sprintf(" return resp.(*admin.%s), nil\n", respName)
s += fmt.Sprintf(" }\n")
s += fmt.Sprintf(" return nil, err\n")
s += fmt.Sprintf("}\n")
return s
}
func generateAllAdminRPC() {
content, err := ioutil.ReadFile(inputFilePath)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to read input file \"%s\" : %s\n", inputFilePath, err)
flag.Usage()
os.Exit(1)
}
csvReader := csv.NewReader(bytes.NewReader(content))
lines, err := csvReader.ReadAll()
if err != nil {
fmt.Fprintf(os.Stderr, "unable to parse csv file \"%s\" : %s\n", inputFilePath, err)
os.Exit(1)
}
fmt.Print(`/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/`)
fmt.Print(`
// Code generated by "generator -i=admin.csv > admin_rpc_types.go"; DO NOT EDIT.
package session
import (
"context"
"fmt"
"github.com/apache/incubator-pegasus/go-client/idl/admin"
"github.com/apache/incubator-pegasus/go-client/idl/base"
)
`)
for i, lineArgs := range lines {
if len(lineArgs) != 4 {
fmt.Fprintf(os.Stderr, "invalid arguments in line %d\n", i)
os.Exit(1)
}
s := generateAdminRPC(lineArgs[0], lineArgs[1], lineArgs[2], lineArgs[3])
fmt.Print(s)
}
}
func generateRAdminRPC(rpcCode, rpcName, reqName, respName string) string {
s := "\n"
s += fmt.Sprintf("// %s is auto-generated\n", rpcName)
s += fmt.Sprintf("func (rs *ReplicaSession) %s(ctx context.Context, req *radmin.%s) (*radmin.%s, error) {\n", rpcName, reqName, respName)
s += fmt.Sprintf(" arg := radmin.NewReplicaClient%sArgs()\n", rpcName)
s += fmt.Sprintf(" arg.Req = req\n")
s += fmt.Sprintf(" result, err := rs.CallWithGpid(ctx, &base.Gpid{Appid: 0, PartitionIndex: 0}, 0, arg, \"%s\")\n", rpcCode)
s += fmt.Sprintf(" if err == nil {\n")
s += fmt.Sprintf(" ret, _ := result.(*radmin.ReplicaClient%sResult)\n", rpcName)
s += fmt.Sprintf(" resp := ret.GetSuccess()\n")
s += fmt.Sprintf(" if resp.GetErr().Errno != base.ERR_OK.String() {\n")
s += fmt.Sprintf(" return resp, fmt.Errorf(\"%s to session %%s failed: %%s\", rs, resp.GetErr().String())\n", rpcName)
s += fmt.Sprintf(" }\n")
s += fmt.Sprintf(" return resp, nil\n")
s += fmt.Sprintf(" }\n")
s += fmt.Sprintf(" return nil, err\n")
s += fmt.Sprintf("}\n")
return s
}
func generateAllRAdminRPC() {
content, err := ioutil.ReadFile(inputFilePath)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to read input file \"%s\" : %s\n", inputFilePath, err)
flag.Usage()
os.Exit(1)
}
csvReader := csv.NewReader(bytes.NewReader(content))
lines, err := csvReader.ReadAll()
if err != nil {
fmt.Fprintf(os.Stderr, "unable to parse csv file \"%s\" : %s\n", inputFilePath, err)
os.Exit(1)
}
fmt.Print(`/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/`)
fmt.Print(`
// Code generated by "generator -i=admin.csv > admin_rpc_types.go"; DO NOT EDIT.
package session
import (
"context"
"fmt"
"github.com/apache/incubator-pegasus/go-client/idl/base"
"github.com/apache/incubator-pegasus/go-client/idl/radmin"
)
`)
for i, lineArgs := range lines {
if len(lineArgs) != 4 {
fmt.Fprintf(os.Stderr, "invalid arguments in line %d\n", i)
os.Exit(1)
}
s := generateRAdminRPC(lineArgs[0], lineArgs[1], lineArgs[2], lineArgs[3])
fmt.Print(s)
}
}
var inputFilePath string
var rpcSuite string
func init() {
flag.StringVar(&inputFilePath, "i", "", "the RPC definition csv file path")
flag.StringVar(&rpcSuite, "t", "", "the RPC suite to generate, options [\"admin\", \"radmin\"]")
}
func main() {
flag.Parse()
if rpcSuite == "admin" {
generateAllAdminRPC()
} else if rpcSuite == "radmin" {
generateAllRAdminRPC()
}
}