diff --git a/args/args.go b/args/args.go index 8ad37236..add7da49 100644 --- a/args/args.go +++ b/args/args.go @@ -255,7 +255,6 @@ Available generators (and options): go // println(align(b.Options())) //} println() - os.Exit(2) } // align the help strings for plugin options. diff --git a/config/config.go b/config/config.go index 0558ce00..9cae7a45 100644 --- a/config/config.go +++ b/config/config.go @@ -19,8 +19,11 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "strings" + "github.com/cloudwego/thriftgo/utils/dir_utils" + "gopkg.in/yaml.v3" ) @@ -78,25 +81,45 @@ func (r *RefConfig) IsAllFieldsEmpty() bool { } var globalConfig *Config +var useAbs bool = true func GetRef(name string) *RefConfig { if globalConfig == nil { return nil } - return globalConfig.Ref[name] + if useAbs { + name, _ = filepath.Abs(name) + } + refConfig, ok := globalConfig.Ref[name] + if globalConfig.Debug { + if ok { + fmt.Printf("[idl-ref-get]Successfully Get: %s\n", name) + } else { + fmt.Printf("[idl-ref-get]Not IDL Ref: %s\n", name) + } + } + return refConfig } -func init() { +func LoadConfig() error { config, err := initConfig() if err != nil { - panic(errors.New("failed to parse idl ref config: " + err.Error())) + return errors.New("failed to parse idl ref config: " + err.Error()) } globalConfig = config + return nil } func initConfig() (*Config, error) { configPaths := []string{"idl-ref.yml", "idl-ref.yaml"} for _, path := range configPaths { + if dir_utils.HasGlobalWd() { + dirpath, err := dir_utils.Getwd() + if err != nil { + return nil, err + } + path = filepath.Join(dirpath, path) + } _, err := os.Stat(path) if err == nil { return loadConfig(path) @@ -124,7 +147,17 @@ func loadConfig(filename string) (*Config, error) { config.Ref = map[string]*RefConfig{} for k, v := range rawConfig.Ref { var rc RefConfig - + // if use absolute path to match idl-ref path and current file path + // convert the idl path to absoulute path + if useAbs { + k, err = dir_utils.ToAbsolute(k) + if err != nil { + return nil, err + } + } + if config.Debug { + fmt.Printf("[idl-ref-register]Path: %s\n", k) + } switch val := v.(type) { case map[string]interface{}: err = mapToStruct(val, &rc) diff --git a/main.go b/main.go index cc7245f8..e05036a3 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,8 @@ import ( "runtime/debug" "runtime/pprof" + "github.com/cloudwego/thriftgo/config" + "time" "github.com/cloudwego/thriftgo/args" @@ -39,6 +41,10 @@ var ( var debugMode bool func init() { + err := config.LoadConfig() + if err != nil { + panic(err) + } _ = g.RegisterBackend(new(golang.GoBackend)) // export THRIFTGO_DEBUG=1 debugMode = os.Getenv("THRIFTGO_DEBUG") == "1" diff --git a/sdk/sdk.go b/sdk/sdk.go index fc10a4cc..7bb07174 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -16,16 +16,18 @@ package sdk import ( "fmt" - "os" - "github.com/cloudwego/thriftgo/args" + "github.com/cloudwego/thriftgo/utils/dir_utils" + + "github.com/cloudwego/thriftgo/config" + + targs "github.com/cloudwego/thriftgo/args" "github.com/cloudwego/thriftgo/generator" "github.com/cloudwego/thriftgo/generator/backend" "github.com/cloudwego/thriftgo/generator/golang" "github.com/cloudwego/thriftgo/parser" "github.com/cloudwego/thriftgo/plugin" "github.com/cloudwego/thriftgo/semantic" - "github.com/cloudwego/thriftgo/utils/dir_utils" "github.com/cloudwego/thriftgo/version" ) @@ -34,19 +36,34 @@ func init() { } var ( - a args.Arguments g generator.Generator ) func RunThriftgoAsSDK(wd string, plugins []plugin.SDKPlugin, args ...string) error { + // this should execute at the first line! dir_utils.SetGlobalwd(wd) - err := a.Parse(append([]string{"thriftgo"}, args...)) + err := config.LoadConfig() + if err != nil { + return err + } + + var a targs.Arguments + + err = a.Parse(append([]string{"thriftgo"}, args...)) if err != nil { + if err.Error() == "flag: help requested" { + return nil + } return err } + if a.AskVersion { + println("thriftgo", version.ThriftgoVersion) + return nil + } + ast, err := parser.ParseFile(a.IDL, a.Includes, true) if err != nil { return err @@ -80,8 +97,7 @@ func RunThriftgoAsSDK(wd string, plugins []plugin.SDKPlugin, args ...string) err } if len(langs) == 0 { - println("No output language(s) specified") - os.Exit(2) + return fmt.Errorf("No output language(s) specified") } log := backend.DummyLogFunc() diff --git a/utils/dir_utils/dir_utils.go b/utils/dir_utils/dir_utils.go index d7c07d27..4408fd7d 100644 --- a/utils/dir_utils/dir_utils.go +++ b/utils/dir_utils/dir_utils.go @@ -17,6 +17,7 @@ package dir_utils import ( "os" "path/filepath" + "strings" ) var globalwd string @@ -40,3 +41,19 @@ func Getwd() (string, error) { wantedwd := globalwd return filepath.Rel(currentwd, wantedwd) } + +func ToAbsolute(k string) (string, error) { + if !strings.HasSuffix(k, "/") { + wd, err := Getwd() + if err != nil { + return "", err + } + k = filepath.Join(wd, k) + absK, err := filepath.Abs(k) + if err != nil { + return "", err + } + k = absK + } + return k, nil +}