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