github.com/BurntSushi/xgb@v0.0.0-20210121224620-deaf085860bc/xgbgen/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"io/ioutil"
     6  	"log"
     7  	"os"
     8  	"os/exec"
     9  	"strings"
    10  )
    11  
    12  var (
    13  	protoPath = flag.String("proto-path",
    14  		"/usr/share/xcb", "path to directory of X protocol XML files")
    15  	gofmt = flag.Bool("gofmt", true,
    16  		"When disabled, gofmt will not be run before outputting Go code")
    17  )
    18  
    19  func usage() {
    20  	basename := os.Args[0]
    21  	if lastSlash := strings.LastIndex(basename, "/"); lastSlash > -1 {
    22  		basename = basename[lastSlash+1:]
    23  	}
    24  	log.Printf("Usage: %s [flags] xml-file", basename)
    25  	flag.PrintDefaults()
    26  	os.Exit(1)
    27  }
    28  
    29  func init() {
    30  	log.SetFlags(0)
    31  }
    32  
    33  func main() {
    34  	flag.Usage = usage
    35  	flag.Parse()
    36  
    37  	if flag.NArg() != 1 {
    38  		log.Printf("A single XML protocol file can be processed at once.")
    39  		flag.Usage()
    40  	}
    41  
    42  	// Read the single XML file into []byte
    43  	xmlBytes, err := ioutil.ReadFile(flag.Arg(0))
    44  	if err != nil {
    45  		log.Fatal(err)
    46  	}
    47  
    48  	// Initialize the buffer, parse it, and filter it through gofmt.
    49  	c := newContext()
    50  	c.Morph(xmlBytes)
    51  
    52  	if !*gofmt {
    53  		c.out.WriteTo(os.Stdout)
    54  	} else {
    55  		cmdGofmt := exec.Command("gofmt")
    56  		cmdGofmt.Stdin = c.out
    57  		cmdGofmt.Stdout = os.Stdout
    58  		cmdGofmt.Stderr = os.Stderr
    59  		err = cmdGofmt.Run()
    60  		if err != nil {
    61  			log.Fatal(err)
    62  		}
    63  	}
    64  }