You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package parser
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/emicklei/proto"
|
|
)
|
|
|
|
type (
|
|
// Services is a slice of Service.
|
|
Services []Service
|
|
|
|
// Service describes the rpc service, which is the relevant
|
|
// content after the translation of the proto file
|
|
Service struct {
|
|
*proto.Service
|
|
RPC []*RPC
|
|
}
|
|
)
|
|
|
|
func (s Services) validate(filename string, multipleOpt ...bool) error {
|
|
if len(s) == 0 {
|
|
return errors.New("rpc service not found")
|
|
}
|
|
|
|
var multiple bool
|
|
for _, c := range multipleOpt {
|
|
multiple = c
|
|
}
|
|
|
|
if !multiple && len(s) > 1 {
|
|
return errors.New("only one service expected")
|
|
}
|
|
|
|
name := filepath.Base(filename)
|
|
for _, service := range s {
|
|
for _, rpc := range service.RPC {
|
|
if strings.Contains(rpc.RequestType, ".") {
|
|
return fmt.Errorf("line %v:%v, request type must defined in %s",
|
|
rpc.Position.Line,
|
|
rpc.Position.Column, name)
|
|
}
|
|
if strings.Contains(rpc.ReturnsType, ".") {
|
|
return fmt.Errorf("line %v:%v, returns type must defined in %s",
|
|
rpc.Position.Line,
|
|
rpc.Position.Column, name)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|