go-hep.org/x/hep@v0.38.1/cmd/podio-gen/main.go (about)

     1  // Copyright ©2020 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Command podio-gen generates a complete EDM from a PODIO YAML file definition.
     6  //
     7  // Usage: podio-gen [OPTIONS] edm.yaml
     8  //
     9  // Example:
    10  //
    11  //	$> podio-gen -p myedm -o out.go -r 'edm4hep::->edm_,ExNamespace::->exns_' edm.yaml
    12  //
    13  // Options:
    14  //
    15  //	-o string
    16  //	  	path to the output file containing the generated code (default "out.go")
    17  //	-p string
    18  //	  	package name for the PODIO generated types (default "podio")
    19  //	-r string
    20  //	  	comma-separated list of rewrite rules (e.g., 'edm4hep::->edm_')
    21  package main // import "go-hep.org/x/hep/cmd/podio-gen"
    22  
    23  import (
    24  	"flag"
    25  	"fmt"
    26  	"io"
    27  	"log"
    28  	"os"
    29  )
    30  
    31  func main() {
    32  	log.SetPrefix("podio: ")
    33  	log.SetFlags(0)
    34  
    35  	var (
    36  		pkg     = flag.String("p", "podio", "package name for the PODIO generated types")
    37  		oname   = flag.String("o", "out.go", "path to the output file containing the generated code")
    38  		rewrite = flag.String("r", "", "comma-separated list of rewrite rules (e.g., 'edm4hep::->edm_')")
    39  	)
    40  
    41  	flag.Usage = func() {
    42  		fmt.Printf(`podio-gen generates a complete EDM from a PODIO YAML file definition.
    43  
    44  Usage: podio-gen [OPTIONS] edm.yaml
    45  
    46  Example:
    47  
    48    $> podio-gen -p myedm -o out.go -r 'edm4hep::->edm_,ExNamespace::->exns_' edm.yaml
    49  
    50  Options:
    51  `)
    52  		flag.PrintDefaults()
    53  	}
    54  
    55  	flag.Parse()
    56  
    57  	switch flag.NArg() {
    58  	case 0:
    59  		flag.Usage()
    60  		log.Fatalf("missing input PODIO file")
    61  	case 1:
    62  		// ok
    63  	default:
    64  		flag.Usage()
    65  		log.Fatalf("too many input PODIO files")
    66  	}
    67  
    68  	out, err := os.Create(*oname)
    69  	if err != nil {
    70  		log.Fatalf("could not create output file %q: %+v", *oname, err)
    71  	}
    72  	defer out.Close()
    73  
    74  	fname := flag.Arg(0)
    75  
    76  	err = process(out, *pkg, fname, *rewrite)
    77  	if err != nil {
    78  		log.Fatalf("could not process %q: %+v", fname, err)
    79  	}
    80  
    81  	err = out.Close()
    82  	if err != nil {
    83  		log.Fatalf("could not save output file %q: %+v", *oname, err)
    84  	}
    85  }
    86  
    87  func process(w io.Writer, pkg, fname, rules string) error {
    88  	g, err := newGenerator(w, pkg, fname, rules)
    89  	if err != nil {
    90  		return fmt.Errorf("could not create PODIO generator: %w", err)
    91  	}
    92  
    93  	err = g.generate()
    94  	if err != nil {
    95  		return fmt.Errorf("could not generate PODIO code for %q: %w", fname, err)
    96  	}
    97  
    98  	return nil
    99  }