github.com/Desuuuu/genqlient@v0.5.3/generate/main.go (about) 1 // Package generate provides programmatic access to genqlient's functionality, 2 // and documentation of its configuration options. For general usage 3 // documentation, see github.com/Desuuuu/genqlient. 4 package generate 5 6 import ( 7 "fmt" 8 "os" 9 "path/filepath" 10 "strings" 11 12 "github.com/alexflint/go-arg" 13 ) 14 15 func readConfigGenerateAndWrite(configFilename string) error { 16 var config *Config 17 var err error 18 if configFilename != "" { 19 config, err = ReadAndValidateConfig(configFilename) 20 if err != nil { 21 return err 22 } 23 } else { 24 config, err = ReadAndValidateConfigFromDefaultLocations() 25 if err != nil { 26 return err 27 } 28 } 29 30 generated, err := Generate(config) 31 if err != nil { 32 return err 33 } 34 35 for filename, content := range generated { 36 err = os.MkdirAll(filepath.Dir(filename), 0o755) 37 if err != nil { 38 return errorf(nil, 39 "could not create parent directory for generated file %v: %v", 40 filename, err) 41 } 42 43 err = os.WriteFile(filename, content, 0o644) 44 if err != nil { 45 return errorf(nil, "could not write generated file %v: %v", 46 filename, err) 47 } 48 } 49 return nil 50 } 51 52 type cliArgs struct { 53 ConfigFilename string `arg:"positional" placeholder:"CONFIG" default:"" help:"path to genqlient configuration (default: genqlient.yaml in current or any parent directory)"` 54 Init bool `arg:"--init" help:"write out and use a default config file"` 55 } 56 57 func (cliArgs) Description() string { 58 return strings.TrimSpace(` 59 Generates GraphQL client code for a given schema and queries. 60 See https://github.com/Desuuuu/genqlient for full documentation. 61 `) 62 } 63 64 // Main is the command-line entrypoint to genqlient; it's equivalent to calling 65 // `go run github.com/Desuuuu/genqlient`. For lower-level control over 66 // genqlient's operation, see Generate. 67 func Main() { 68 exitIfError := func(err error) { 69 if err != nil { 70 fmt.Println(err) 71 os.Exit(1) 72 } 73 } 74 75 var args cliArgs 76 arg.MustParse(&args) 77 if args.Init { 78 filename := args.ConfigFilename 79 if filename == "" { 80 filename = "genqlient.yaml" 81 } 82 83 err := initConfig(filename) 84 exitIfError(err) 85 } 86 err := readConfigGenerateAndWrite(args.ConfigFilename) 87 exitIfError(err) 88 }