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  }