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  }