github.com/hasura/ndc-sdk-go/cmd/hasura-ndc-go@v0.0.0-20240508172728-e960be013ca2/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "time" 7 8 "github.com/alecthomas/kong" 9 "github.com/hasura/ndc-sdk-go/cmd/hasura-ndc-go/command" 10 "github.com/hasura/ndc-sdk-go/cmd/hasura-ndc-go/version" 11 "github.com/rs/zerolog" 12 "github.com/rs/zerolog/log" 13 ) 14 15 type GenerateArguments struct { 16 Path string `help:"The base path of the connector's source code" short:"p" default:"."` 17 Directories []string `help:"Folders contain NDC operation functions" short:"d" default:"functions"` 18 Trace string `help:"Enable tracing and write to target file path."` 19 } 20 21 type NewArguments struct { 22 Name string `help:"Name of the connector." short:"n" required:""` 23 Module string `help:"Module name of the connector" short:"m" required:""` 24 Version string `help:"The version of ndc-sdk-go."` 25 Output string `help:"The location where source codes will be generated" short:"o" default:""` 26 } 27 28 var cli struct { 29 LogLevel string `help:"Log level." enum:"debug,info,warn,error" default:"info"` 30 New NewArguments `cmd:"" help:"Initialize an NDC connector boilerplate. For example:\n hasura-ndc-go new -n example -m github.com/foo/example"` 31 Generate GenerateArguments `cmd:"" help:"Generate schema and implementation for the connector from functions."` 32 Test struct { 33 Snapshots command.GenTestSnapshotArguments `cmd:"" help:"Generate test snapshots."` 34 } `cmd:"" help:"Test helpers."` 35 36 Version struct{} `cmd:"" help:"Print the CLI version."` 37 } 38 39 func main() { 40 cmd := kong.Parse(&cli, kong.UsageOnError()) 41 start := time.Now() 42 setupGlobalLogger(cli.LogLevel) 43 44 switch cmd.Command() { 45 case "new": 46 if cli.New.Version == "" { 47 cli.New.Version = version.BuildVersion 48 } 49 50 log.Info(). 51 Str("name", cli.New.Name). 52 Str("module", cli.New.Module). 53 Str("output", cli.New.Output). 54 Str("version", cli.New.Version). 55 Msg("generating the NDC boilerplate...") 56 57 if err := generateNewProject(&cli.New, false); err != nil { 58 log.Fatal().Err(err).Msg("failed to generate new project") 59 } 60 log.Info().Str("exec_time", time.Since(start).Round(time.Second).String()). 61 Msg("generated successfully") 62 case "generate": 63 log.Info(). 64 Str("path", cli.Generate.Path). 65 Interface("directories", cli.Generate.Directories). 66 Msg("generating connector schema...") 67 68 moduleName, err := getModuleName(cli.Generate.Path) 69 if err != nil { 70 log.Fatal().Err(err).Msg("failed to get module name. The base path must contain a go.mod file") 71 } 72 73 if err := os.Chdir(cli.Generate.Path); err != nil { 74 log.Fatal().Err(err).Msg("") 75 } 76 77 if err = parseAndGenerateConnector(&cli.Generate, moduleName); err != nil { 78 log.Fatal().Err(err).Msg("failed to generate connector schema") 79 } 80 if err := execGoFormat("."); err != nil { 81 log.Fatal().Err(err).Msg("failed to format code") 82 } 83 log.Info().Str("exec_time", time.Since(start).Round(time.Millisecond).String()). 84 Msg("generated successfully") 85 case "test snapshots": 86 log.Info(). 87 Str("endpoint", cli.Test.Snapshots.Endpoint). 88 Str("path", cli.Test.Snapshots.Schema). 89 Interface("dir", cli.Test.Snapshots.Dir). 90 Msg("generating test snapshots...") 91 92 if err := command.GenTestSnapshots(&cli.Test.Snapshots); err != nil { 93 log.Fatal().Err(err).Msg("failed to generate test snapshots") 94 } 95 case "version": 96 _, _ = fmt.Print(version.BuildVersion) 97 default: 98 log.Fatal().Msgf("unknown command <%s>", cmd.Command()) 99 } 100 } 101 102 func setupGlobalLogger(level string) { 103 logLevel, err := zerolog.ParseLevel(level) 104 if err != nil { 105 log.Fatal().Err(err).Msgf("failed to parse log level: %s", level) 106 } 107 zerolog.SetGlobalLevel(logLevel) 108 log.Logger = log.Level(logLevel).Output(zerolog.ConsoleWriter{Out: os.Stderr}) 109 }