Change convert to use a struct instead of global variables

This commit is contained in:
lordwelch 2021-02-15 21:35:38 -08:00
parent 97fcfd145c
commit 59f8bdcc54

View File

@ -20,47 +20,46 @@ import (
"github.com/kr/pretty" "github.com/kr/pretty"
) )
var ( type convertFlags struct {
convertFS = flag.NewFlagSet("convert", flag.ExitOnError)
convertFlags = struct {
write bool write bool
printXML bool printXML bool
printResource bool printResource bool
recurse bool recurse bool
logging bool logging bool
parts string parts string
}{} }
)
func convert(arguments []string) { func convert(arguments ...string) error {
convertFS.BoolVar(&convertFlags.write, "w", false, "Replace the file with XML data") var (
convertFS.BoolVar(&convertFlags.printXML, "x", false, "Print XML to stdout") convertFS = flag.NewFlagSet("convert", flag.ExitOnError)
convertFS.BoolVar(&convertFlags.printResource, "R", false, "Print the resource struct to stderr") cvFlags = convertFlags{}
convertFS.BoolVar(&convertFlags.recurse, "r", false, "Recurse into directories") )
convertFS.BoolVar(&convertFlags.logging, "l", false, "Enable logging to stderr") convertFS.BoolVar(&cvFlags.write, "w", false, "Replace the file with XML data")
convertFS.StringVar(&convertFlags.parts, "p", "", "Parts to filter logging for, comma separated") convertFS.BoolVar(&cvFlags.printXML, "x", false, "Print XML to stdout")
convertFS.BoolVar(&cvFlags.printResource, "R", false, "Print the resource struct to stderr")
convertFS.BoolVar(&cvFlags.recurse, "r", false, "Recurse into directories")
convertFS.BoolVar(&cvFlags.logging, "l", false, "Enable logging to stderr")
convertFS.StringVar(&cvFlags.parts, "p", "", "Parts to filter logging for, comma separated")
convertFS.Parse(arguments) convertFS.Parse(arguments)
if convertFlags.logging { if cvFlags.logging {
lsgo.Logger = lsgo.NewFilter(map[string][]string{ lsgo.Logger = lsgo.NewFilter(map[string][]string{
"part": strings.Split(convertFlags.parts, ","), "part": strings.Split(cvFlags.parts, ","),
}, log.NewLogfmtLogger(os.Stderr)) }, log.NewLogfmtLogger(os.Stderr))
} }
for _, v := range convertFS.Args() { for _, v := range convertFS.Args() {
fi, err := os.Stat(v) fi, err := os.Stat(v)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) return err
os.Exit(1)
} }
switch { switch {
case !fi.IsDir(): case !fi.IsDir():
err = openLSF(v) err = cvFlags.openLSF(v)
if err != nil && !errors.As(err, &lsgo.HeaderError{}) { if err != nil && !errors.As(err, &lsgo.HeaderError{}) {
fmt.Fprintln(os.Stderr, err) return err
os.Exit(1)
} }
case convertFlags.recurse: case cvFlags.recurse:
_ = filepath.Walk(v, func(path string, info os.FileInfo, err error) error { _ = filepath.Walk(v, func(path string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
return nil return nil
@ -71,21 +70,21 @@ func convert(arguments []string) {
} }
return nil return nil
} }
err = openLSF(path) err = cvFlags.openLSF(path)
if err != nil && !errors.As(err, &lsgo.HeaderError{}) { if err != nil && !errors.Is(err, lsgo.ErrFormat) {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
} }
return nil return nil
}) })
default: default:
fmt.Fprintf(os.Stderr, "lsconvert: %s: Is a directory\n", v) return fmt.Errorf("lsconvert: %s: Is a directory\n", v)
os.Exit(1)
} }
} }
return nil
} }
func openLSF(filename string) error { func (cf *convertFlags) openLSF(filename string) error {
var ( var (
l *lsgo.Resource l *lsgo.Resource
err error err error
@ -99,21 +98,21 @@ func openLSF(filename string) error {
if err != nil { if err != nil {
return fmt.Errorf("reading LSF file %s failed: %w", filename, err) return fmt.Errorf("reading LSF file %s failed: %w", filename, err)
} }
if convertFlags.printResource { if cf.printResource {
pretty.Log(l) pretty.Log(l)
} }
if convertFlags.printXML || convertFlags.write { if cf.printXML || cf.write {
n, err = marshalXML(l) n, err = marshalXML(l)
if err != nil { if err != nil {
return fmt.Errorf("creating XML from LSF file %s failed: %w", filename, err) return fmt.Errorf("creating XML from LSF file %s failed: %w", filename, err)
} }
if convertFlags.write { if cf.write {
f, err = os.OpenFile(filename, os.O_TRUNC|os.O_RDWR, 0o666) f, err = os.OpenFile(filename, os.O_TRUNC|os.O_RDWR, 0o666)
if err != nil { if err != nil {
return fmt.Errorf("writing XML from LSF file %s failed: %w", filename, err) return fmt.Errorf("writing XML from LSF file %s failed: %w", filename, err)
} }
} else if convertFlags.printXML { } else if cf.printXML {
f = os.Stdout f = os.Stdout
} }
@ -188,7 +187,7 @@ func readLSF(filename string) (*lsgo.Resource, error) {
l, _, err = lsgo.Decode(r) l, _, err = lsgo.Decode(r)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("decoding %q failed: %w", filename, err)
} }
return &l, nil return &l, nil
} }