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  }